3

我有一个带有 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 文件类中的类的外部库模块。

4

1 回答 1

2

我找到了解决我的问题的方法。在玩了一段时间 jboss-deployment-structure.xml 和模块之后,我意识到不可能让外部模块使用或扩展 ear/war 的类。为了实现我的目标,我必须让位于外部位置的 jar 文件由加载 ear 库的同一个类加载器加载。这可以通过将资源直接添加到 ear 文件来实现,如下所示(jboss-deployment-structure.xml):

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2">
<ear-subdeployments-isolated>false</ear-subdeployments-isolated>
<deployment>
    <dependencies>
        <module name="org.jboss.as.jmx"/>
        <module name="org.jboss.logmanager"/>
    </dependencies>
<resources>
    <resource-root path="../../../../../../../../../externalLib/externalLibrary-0.0.1-SNAPSHOT.jar" /> 
</resources>
</deployment>

<sub-deployment name="myservice.war">
</sub-deployment>
<sub-deployment name="admin.war">
</sub-deployment>   

资源根路径是相对于standalone/deployments 文件夹中的ear 文件的。以这种方式添加资源根目录相当于将库添加到ear文件的lib文件夹中。因此,这确保了我的外部库也作为主类加载器的一部分加载,该类加载器加载了我所有框架库所在的耳朵。

于 2013-07-23T15:26:32.667 回答