如何指定 JBoss WildFly 部署应加载其 lib 模块并导入服务?
How to specify that a JBoss WildFly deployment should load its lib module with services imported?
我有一个结构类似的 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/services 下标准类加载器默认不加载的内容。
我正在尝试使用服务属性来允许类加载器访问 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)
...调用采用特定 class 加载器的方法的重载版本:
ServiceLocator.load(Class, ClassLoader)
这 JBossDeveloperForums reply 提供了重要的线索。单一参数调用在 JBossAS 5.1.0GA 中完美运行了十年,但在 WildFly 17 中更复杂的 class 加载中却无法正常工作。
两个参数调用的一个小问题是,如果将服务配置部署为模块,则部署在 ear 存档的 lib 目录中的服务器端代理实现将看不到它们。我认为这是因为代理是由父 (lib) class 加载器加载的,而不是 EJB 模块 class 加载器,它尊重 jboss-deployment-[=24= 中声明的依赖项].如果服务配置也部署在 lib 目录中,则代理可以访问它们。
我有一个结构类似的 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/services 下标准类加载器默认不加载的内容。
我正在尝试使用服务属性来允许类加载器访问 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)
...调用采用特定 class 加载器的方法的重载版本:
ServiceLocator.load(Class, ClassLoader)
这 JBossDeveloperForums reply 提供了重要的线索。单一参数调用在 JBossAS 5.1.0GA 中完美运行了十年,但在 WildFly 17 中更复杂的 class 加载中却无法正常工作。
两个参数调用的一个小问题是,如果将服务配置部署为模块,则部署在 ear 存档的 lib 目录中的服务器端代理实现将看不到它们。我认为这是因为代理是由父 (lib) class 加载器加载的,而不是 EJB 模块 class 加载器,它尊重 jboss-deployment-[=24= 中声明的依赖项].如果服务配置也部署在 lib 目录中,则代理可以访问它们。