如何指定 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 目录中,则代理可以访问它们。