我有一个带有 ear 文件的 JBoss 服务器。我的耳朵文件有一个战争文件。战争文件有一个 jar 文件“server-artifact.jar”。我的服务器的服务端点在那个 jar 中。jar 文件中的类动态加载一个类以执行操作。
Class<?> clazz = (Class<?>) Class.forName("com.test.TestExternalAccess");
try {
TestExternalAccessParent extClassObject = (TestExternalAccessParent) clazz.newInstance();
extClassObject.sayHelloToExternalAccess();
} catch (InstantiationException | IllegalAccessException e) {
e.printStackTrace();
}
包含接口“TestExternalAccessParent”的jar文件也是war文件的一部分。“TestExternalAccess”类是一个具体的类,旨在成为我的服务器的可插拔单元。为了实现这一点,我创建了一个 jboss 模块并将其放在模块文件夹中(如何?):
<module xmlns="urn:jboss:module:1.1" name="com.test">
<resources>
<resource-root path="externalLibrary-0.0.1-SNAPSHOT.jar"/>
</resources>
</module>
<module name="com.test" />
我还编辑了 jboss-deployment-structure.xml 并添加了启动服务器并运行它的依赖项
。当类的动态加载发生时,我得到以下异常:
java.lang.ClassNotFoundException: com.test.TestExternalAccess from [Module "deployment.myservice-ear.ear:main" from Service Module Loader]
我尝试过的一些事情:1)尝试从外部模块加载一个类,该类未在主ear文件的jar文件中实现接口并且工作正常。2) 更改了我的模块以包含包含接口的 jar 文件。
<module xmlns="urn:jboss:module:1.1" name="com.test">
<resources>
<resource-root path="externalLibrary-0.0.1-SNAPSHOT.jar"/>
<resource-root path="externalParentLibrary-0.0.1-SNAPSHOT.jar"/>
</resources>
</module>
这也很好。3)向我的模块添加了以下依赖项:
<dependencies>
<module name="deployment.myservice-ear.ear"/>
</dependencies>
那是行不通的。
加载我耳朵的类加载器使用另一个类加载器来加载我的外部模块并访问该模块中的类。但是我的外部模块中的类似乎无法访问耳朵中的罐子。我怎样才能做到这一点?我想添加可以访问我服务器的 ear 文件类中的类的外部库模块。