WildFly:从 wildfly 模块访问 war/lib 类

WildFly: Access war/lib classes from wildfly modules

提问人:Wizzard 提问时间:5/16/2018 最后编辑:Wizzard 更新时间:5/25/2018 访问量:945

问:

我有wildfly,创建了spring模块和myApp.ear, myApp.ear 包含 myApp.war,里面有 WEB-INF/lib/commons-pool2-2.4.2.jar 和 WEB-INF/lib/myApp-core.jar 在myApp-core.jar中,我有Spring Context,其中具有:

<bean id="myAppPoolTargetSource" class="org.springframework.aop.target.CommonsPool2TargetSource">
    <property name="targetBeanName" value="dataPostComponentTarget" />
    <property name="maxSize" value="${POOL_POST_SIZE}" />
    <property name="maxIdle" value="${POOL_POST_SIZE}"/>
    <property name="minIdle" value="${POOL_POST_SIZE}"/>
</bean>

我有jboss部署描述符jboss-deployment-structure.xml:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<jboss-deployment-structure>
    <deployment>
        <dependencies>
            <module export="true" meta-inf="export" name="org.springframework.spring"/>
            <module export="true" meta-inf="export" name="org.apache.cxf"/>
            <module export="true" meta-inf="export" name="org.apache.cxf.impl"/>
            <module export="true" name="javax.orb.api"/>
            <module export="true" name="org.apache.commons.beanutils"/>
        </dependencies>
        <exclude-subsystems>
            <subsystem name="logging"/>
        </exclude-subsystems>
    </deployment>
</jboss-deployment-structure>

我也在wildfly中为春天创建了模块,这里是module.xml:

<?xml version='1.0' encoding='UTF-8'?>
<module xmlns="urn:jboss:module:1.5" name="org.springframework.spring">
    <resources>

        <resource-root path="spring-beans-4.3.14.RELEASE.jar"/>
        <resource-root path="spring-core-4.3.14.RELEASE.jar"/>
        <resource-root path="spring-aop-4.3.14.RELEASE.jar"/>
        <resource-root path="spring-expression-4.3.14.RELEASE.jar"/>
        <resource-root path="spring-web-4.3.14.RELEASE.jar"/>
        <resource-root path="spring-webmvc-4.3.14.RELEASE.jar"/>
        <resource-root path="spring-jms-4.3.14.RELEASE.jar"/>
        <resource-root path="spring-messaging-4.3.14.RELEASE.jar"/>
        <resource-root path="spring-tx-4.3.14.RELEASE.jar"/>
        <resource-root path="spring-context-4.3.14.RELEASE.jar"/>
        <resource-root path="spring-context-support-4.3.14.RELEASE.jar"/>
        <resource-root path="spring-oxm-4.3.14.RELEASE.jar"/>
    </resources>

    <dependencies>
        <module name="org.apache.commons.logging"/>
        <module name="org.jboss.vfs" />
        <module name="org.jboss.msc" />
    <module name="javaee.api"/>
    </dependencies>
</module>

对于其他人来说,我的耳朵是完美的,但对于这个耳朵来说,它是失败的:

Caused by: java.lang.NoClassDefFoundError: Failed to link org/springframework/aop/target/CommonsPool2TargetSource (Module "org.springframework.spring" from local module loader @51931956 (finder: local module finder @2b4a2ec7 (roots: C:\wildfly-11.0.0.Final\modules,C:\wildfly-11.0.0.Final\modules\system\layers\base))): org/apache/commons/pool2/PooledObjectFactory 

完全清楚的原因 spring 模块类加载器看不到 myApp.war/lib 中的类,但我如何使它们可见? 为了使模块对其他部署可见,我可以在依赖项中添加“export=true”,但它如何在不同的方向上实现?

更新

我试图将池库 jar 移动到 .ear/lib 中并设置

<ear-subdeployments-isolated>false</ear-subdeployments-isolated>

在部署描述符中,但不起作用

Spring 模块 Wildfly Classloader

评论


答:

2赞 James R. Perkins 5/17/2018 #1

池库需要成为模块的一部分。将无法在部署中看到库。您可以将库添加到 或创建一个新模块,并让该模块依赖于它。org.springframework.springcommons-pool2-2.4.2.jarorg.springframework.springorg.springframework.spring

评论

0赞 Wizzard 5/17/2018
是的,谢谢!我试过这个并且它正在工作,但它看起来不是很好的解决方案,因为在我的 EAR 中,我可以使用不同的附加库,然后不能将它们全部添加到 spring 模块或其他模块中。
0赞 James R. Perkins 5/17/2018
唯一的其他选择是将 Spring 也包含在您的应用程序中。