1

我有一个结构如下的 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 下标准类加载器默认不加载的内容。

我正在尝试使用 services 属性来允许类加载器访问 META-INF/services 目录,但我找不到将库 jar 指定为模块或包含 META-INF/ 的资源的方法服务。

有没有办法做到这一点?这是我尝试过的 [其中一些] 事情的一个例子:

<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 中运行良好,但是证明它的结构很难用新的类加载器来描述。

4

1 回答 1

1

事实证明,我不需要做任何特别的事情来使 lib 目录中 jar 文件的 META-INF/services 目录对这些相同 jar 文件中的代码可见。

答案是替换此方法的所有调用:

ServiceLocator.load(Class)

...调用采用特定类加载器的方法的重载版本:

ServiceLocator.load(Class, ClassLoader)

这个JBossDeveloperForums 回复提供了重要线索。单个参数调用在 JBossAS 5.1.0GA 中完美运行了十年,但不适用于 WildFly 17 中更复杂的类加载。

两个参数调用的一个小怪癖是,如果服务配置被部署为一个模块,那么部署在 ear 存档的 lib 目录中的服务器端代理实现将看不到它们。我认为这是因为代理是由父(lib)类加载器加载的,而不是尊重 jboss-deployment-structure.xml 中声明的依赖关系的 EJB 模块类加载器。如果服务配置也部署在 lib 目录中,则代理可以访问它们。

于 2019-08-27T09:15:03.583 回答