如何指定JBoss WildFly部署应使用导入的服务加载其lib模块?
我有一个ear文件,其结构如下,我正试图在WildFly 17中部署该文件:如何指定JBoss WildFly部署应使用导入的服务加载其lib模块?,jboss,wildfly,jboss-modules,classloading,Jboss,Wildfly,Jboss Modules,Classloading,我有一个ear文件,其结构如下,我正试图在WildFly 17中部署该文件: my-application-ear.ear |-- my-ejb-jar-1.jar |-- my-ejb-jar-2.jar |-- lib/ |-- my-library-jar.jar |-- ... |-- META-INF |-- MANIFEST.MF |-- jboss-deployment-structure.xml my library jar包含META-INF/
my-application-ear.ear
|-- my-ejb-jar-1.jar
|-- my-ejb-jar-2.jar
|-- lib/
|-- my-library-jar.jar
|-- ...
|-- META-INF
|-- MANIFEST.MF
|-- jboss-deployment-structure.xml
my library jar包含META-INF/services下的内容,标准类加载器默认情况下不会加载这些内容
我试图使用services属性来允许classloader访问META-INF/services目录,但找不到将库jar指定为模块或包含META-INF/services的资源的方法
有办法做到这一点吗?这是我尝试过的许多事情中的一个例子:
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.3">
<deployment>
<dependencies>
<!-- snip! -->
...
<!-- These don't work - looking for a way to load lib jar files with services. -->
<module name="my-library-jar.jar" services="import" />
<module name="lib.my-library-jar.jar" services="import" />
<module name="lib/my-library-jar.jar" services="import" />
<module name="deployment.my-application-ear.ear.my-library-jar.jar" services="import" />
<module name="deployment.my-application-ear.ear.lib.my-library-jar.jar" services="import" />
<module name="deployment.my-application-ear.ear/my-library-jar.jar" services="import" />
<module name="deployment.my-application-ear.ear/lib/my-library-jar.jar" services="import" />
<module name="deployment.my-application-ear.ear.parent.my-library-jar.jar" services="import" />
</dependencies>
</deployment>
</jboss-deployment-structure>
...
如果可能,我更愿意使用部署描述符,而不是修改清单文件的Dependencies属性
这个应用程序相当大,在JBoss 5.1中运行得很好,但是它的结构很难向新的类加载器描述。结果证明,我不需要做任何特殊的事情,就可以使lib目录中jar文件的META-INF/services目录对那些jar文件中的代码可见 答案是替换此方法的所有调用:
ServiceLocator.load(Class)
。。。通过调用采用特定类装入器的方法的重载版本:
ServiceLocator.load(Class, ClassLoader)
这提供了重要的线索。单参数调用在JBossas5.1.0GA中完美地工作了十年,但在WildFly 17中更复杂的类加载中却无法工作
双参数调用的一个小问题是,如果服务配置作为模块部署,那么部署在ear归档文件的lib目录中的服务器端代理实现将看不到它们。我认为这是因为代理是由父(lib)类加载器加载的,而不是尊重jboss-deployment-structure.xml中声明的依赖关系的EJB模块类加载器。如果服务配置也部署在lib目录中,则代理可以访问它们