【问题标题】:Jboss EAP 7 - How to exclude implicit modules from deployment (javax.jms)?Jboss EAP 7 - 如何从部署中排除隐式模块(javax.jms)?
【发布时间】:2017-12-11 18:40:56
【问题描述】:

我不认为我会在这里结束,但经过大量 Google 和 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 类。那么,我该如何正确地做到这一点呢?

【问题讨论】:

  • 我不确定这是否可行,但子系统名称应为 messaging-activemq,例如&lt;subsystem name="messaging-activemq"/&gt; 排除在外。但是我不确定 JMS 是否会在您的部署中正常工作,除非您还包含一个实现。
  • 喂,你找到解决办法了吗?
  • @sghaierali 我刚刚标记了对我有用的答案。 stackoverflow.com/a/47912334/1175279

标签: java jboss jboss-eap-7


【解决方案1】:

正确的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】:

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

    【讨论】:

    • 我不明白。
    • 不明白哪一部分?
    • 我无法从我的 WAR(部署)中删除 JMS API。请仔细阅读更新后的问题。
    • 当然可以。 JBoss 提供 JMS API 你提供 JMS 实现。没问题。
    • 如果我从我的 WAR 文件中删除 JMS jar,我会在部署 WAR 时收到 NoClassDefFoundError: javax/jms/Destination 错误。
    【解决方案3】:

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

    值得注意的是:

    我认为问题在于 activemq-all-5.4.2.jar 包含 javax.jms.*。您的部署已经从 javaee.api 模块中隐式地获取了这个信息(请参阅有关隐式模块依赖关系的更多信息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 的方法。我不会从那篇文章中提取信息,因为它没有回答最初的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-08
      • 2017-05-11
      • 1970-01-01
      • 1970-01-01
      • 2018-11-20
      • 1970-01-01
      相关资源
      最近更新 更多