如何指定JBoss WildFly部署应使用导入的服务加载其lib模块?

如何指定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/

我有一个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属性来允许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目录中,则代理可以访问它们