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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Jboss EAP 7 - 如何从部署中排除隐式模块(javax.jms)?相关的知识,希望对你有一定的参考价值。

我不认为我会在这里结束,但经过很多谷歌和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不加载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类。那么,我该怎么做呢?

答案

正确的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。

另一答案

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

另一答案

这个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。我不会从该文章中提取信息,因为它没有回答原始问题。

以上是关于Jboss EAP 7 - 如何从部署中排除隐式模块(javax.jms)?的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Jboss-eap-6.4 中部署 Spring Boot 应用程序

Jboss (6.4 EAP) 到 WebSphere (7.x)

JBoss EAP 7.1 部署失败的集成器:未找到提供程序

在不重新部署的情况下更新 jboss EAP 7 上的现有战争

如何为 Undertow / JBoss 7.2 EAP 重写 RewriteValve?

如何从 Jboss EAP 6.4 中部署的所有战争的 manifest.mf 文件中获取实现版本详细信息