JBoss EAP 7 - 如何排除部署中的隐式模块(javax.jms)?

10

我没想到我最终会在这里,但经过了大量的谷歌和StackOverflow搜索,我来到这里了。

我的确切问题与此相同,只是我负担不起进行代码更改。

我正在尝试部署的WAR包中包含一个JMS库(即javax.jms),我无法从WAR包中排除它,因为它已经被Jboss EAP 7默认加载。 Jar的路径类似于:jboss/modules/system/layers/base/javax/jms/api/ain/jboss-jms-api_2.0_spec-1.0.0.Final-redhat-1.jar。由于加载了相同类的两个不同版本,我得到了ClassCastException异常。

org.apache.activemq-ra.ActiveMQConnectionFactory cannot to be cast to javax.jms.ConnectionFactory
所以,我希望Jboss不要加载javax.jms,这样我的应用程序就可以使用WAR包中包含的JAR文件。
所以,我想知道是否有任何方法可以全局排除该模块(适用于所有WAR部署)。
每次部署时排除它也可以。我知道可以使用jboss-deployment-structure.xml来实现,但我无法使其正常工作。
以下是我尝试过的内容:
<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure
        xmlns="urn:jboss:deployment-structure:1.2">
    <deployment>
        <exclude-subsystems>
            <subsystem name="javax" />
            <subsystem name="javax.jms" />
        </exclude-subsystems>
    </deployment>
</jboss-deployment-structure>

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure
    xmlns="urn:jboss:deployment-structure:1.2">
    <deployment>
        <exclusions>
            <module name="javax" />
            <module name="javax.jms" />
            <module name="javax.jms.api" />
        </exclusions>
    </deployment>
</jboss-deployment-structure>

我把文件放在WEB-INF目录中,但它没有起作用。 它仍然从Jboss EAP的modules文件夹加载JMS类。 那么,我应该如何正确地做到这一点?


1
我不确定这会不会起作用,但子系统名称应该是 messaging-activemq,例如在排除中 <subsystem name="messaging-activemq"/>。然而,除非您还包括实现,否则我不确定 JMS 在您的部署中是否能正常工作。 - James R. Perkins
嗨,你找到解决方案了吗? - sghaier ali
@sghaierali 我刚刚标记了对我有用的答案。https://dev59.com/cFYN5IYBdhLWcg3wO2DE#47912334 - Dilip Raj Baral
3个回答

3

您应该将JMS API JAR从您的部署中删除。您仍然可以在您的部署中保留JMS实现JAR,但最好将其放在RAR中,最好放在您的部署之外。


我不明白。 - Dilip Raj Baral
你不明白哪个部分? - Philippe Marschall
我无法从我的WAR(部署)中删除JMS API。请仔细阅读更新后的问题。 - Dilip Raj Baral
当然可以。JBoss提供JMS API,您提供JMS实现即可。没问题。 - Philippe Marschall
如果我从WAR文件中删除JMS jar,则在部署WAR时会出现“NoClassDefFoundError: javax/jms/Destination”错误。 - Dilip Raj Baral

3

这里是正确的 jboss-deployment-structure.xml 文件:

<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2">
    <deployment>
        <exclude-subsystems>
            <subsystem name="messaging-activemq"></subsystem>
        </exclude-subsystems>
        <exclusions>
            <module name="javax.jms.api"></module>
        </exclusions>
    </deployment>
</jboss-deployment-structure>

这样做可以将消息子系统和JMS api都排除在外。


1

这个链接有一些你可以尝试的东西。

特别是:

我认为问题在于activemq-all-5.4.2.jar包含javax.jms.*。你的部署已经从javaee.api模块中隐式获取了这个接口(有关隐式模块依赖的更多信息,请参见此处)。我认为将Java EE接口打包到应用程序模块/ jar中是不合适的。你可以尝试简单地从activemq-all-5.4.2.jar中删除javax目录,或者在你的模块中使用不同的ActiveMQ jars来限制它只使用你需要的内容。

和/或修改你的ActiveMQ module.xml文件。

<module xmlns="urn:jboss:module:1.0" name="activemq">  
    <resources>  
        <resource-root path="activemq-all-5.4.2.jar"/>  
    </resources>  
    <dependencies>  
        <module name="javax.api"/>  
    </dependencies>
</module>

如果您有兴趣,似乎也有一种方法可以在Jboss中嵌入ActiveMQ。但由于它没有回答原始问题,所以我不会从那篇文章中提取信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接