我不认为我会在这里结束,但经过很多谷歌和StackOverflow搜索后,我就是这样。
This is my exact problem,但我无法承担更改代码的费用。
我正在尝试部署的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 NOT 加载 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类。那么,我该怎么做呢?
答案 0 :(得分:3)
您应该从部署中删除JMS API JAR。您仍然可以在部署中保留JMS实现JAR,但这应该最终在RAR中,最好是在部署之外。
答案 1 :(得分: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。
答案 2 :(得分:1)
这个link有一些你可以尝试的东西。
值得注意的是:
我认为问题在于activemq-all-5.4.2.jar包含javax.jms。*。您的部署已经从javaee.api模块中隐式获取了这一点(请参阅有关implicity模块依赖项的更多信息here)。我认为应用程序模块/ jar打包Java EE接口是不合适的。您可以尝试从activemq-all-5.4.2.jar中删除javax目录,或者在模块中使用一组不同的ActiveMQ jar来限制它仅限于您需要的内容。
和/或更改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>
如果您有兴趣,似乎还有embed ActiveMQ in Jboss的方法。我不会从该文章中提取信息,因为它没有回答原始问题。