Jboss EAP 7 - 如何从部署中排除隐式模块 (javax.jms)?
Jboss EAP 7 - How to exclude implicit modules from deployment (javax.jms)?
我不认为我会在这里结束,但经过大量 Google 和 Whosebug 搜索后,我来到了这里。
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
。由于这两个不同版本的相同 classes 加载我得到 ClassCastException.
org.apache.activemq-ra.ActiveMQConnectionFactory cannot to be cast to javax.jms.ConnectionFactory
所以,我希望 Jboss NOT 加载 javax.jms 以便我的应用程序可以使用 JAR包含在 WAR.
中
所以,我想知道是否有任何方法可以全局排除模块(对于所有 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 class。那么,我该如何正确执行此操作?
您应该从部署中删除 JMS API JAR。您仍然可以在您的部署中保留 JMS 实现 JAR,但它应该以 RAR 形式结束,最好在您的部署之外。
这个link有一些你可以尝试的东西。
值得注意的是:
I think the problem is that activemq-all-5.4.2.jar contains javax.jms.*. Your deployment already gets this implicitly from the javaee.api module (see more information about implicity module dependencies here). I don't think it is appropriate for an application module/jar to package Java EE interfaces. You can try simply deleting the javax directory from activemq-all-5.4.2.jar or using a different set of ActiveMQ jars in your module to limit it to only what you need.
and/or 为 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 的方法,如果您有兴趣的话。我不会从那篇文章中提取信息,因为它没有回答原始问题。
正确的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。
我不认为我会在这里结束,但经过大量 Google 和 Whosebug 搜索后,我来到了这里。
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
。由于这两个不同版本的相同 classes 加载我得到 ClassCastException.
org.apache.activemq-ra.ActiveMQConnectionFactory cannot to be cast to javax.jms.ConnectionFactory
所以,我希望 Jboss NOT 加载 javax.jms 以便我的应用程序可以使用 JAR包含在 WAR.
中所以,我想知道是否有任何方法可以全局排除模块(对于所有 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 class。那么,我该如何正确执行此操作?
您应该从部署中删除 JMS API JAR。您仍然可以在您的部署中保留 JMS 实现 JAR,但它应该以 RAR 形式结束,最好在您的部署之外。
这个link有一些你可以尝试的东西。
值得注意的是:
I think the problem is that activemq-all-5.4.2.jar contains javax.jms.*. Your deployment already gets this implicitly from the javaee.api module (see more information about implicity module dependencies here). I don't think it is appropriate for an application module/jar to package Java EE interfaces. You can try simply deleting the javax directory from activemq-all-5.4.2.jar or using a different set of ActiveMQ jars in your module to limit it to only what you need.
and/or 为 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 的方法,如果您有兴趣的话。我不会从那篇文章中提取信息,因为它没有回答原始问题。
正确的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。