【问题标题】:Why does my JBoss module throw a ClassCastException?为什么我的 JBoss 模块会抛出 ClassCastException?
【发布时间】:2015-03-15 09:28:19
【问题描述】:

您好 StackOverflow 社区,

我有一个已部署到 JBoss Wildfly 8.2 实例的 WAR。同样在 Wildfly,我创建了两个模块:

  1. 第三方 JMS JCA 适配器模块,
  2. 和一个模型模块 (model.jar),其中包含用于在 JMS 代理和 WAR 之间进行通信的消息类

WAR 有一个 jboss-deployment-structure.xml,它声明了对 JCA 模块的依赖:

<?xml version='1.0' encoding='UTF-8'?>
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2">
    <deployment>
        <dependencies>
            <module name="com.thirdparty.mq.ra" slot="main"/>
            <module name="com.company.model" slot="main">
        </dependencies>
    </deployment>
</jboss-deployment-structure>

WAR 将 model.jar 文件打包在其 WEB-INF/lib 文件夹中。

JMS 模块依赖于模型模块:

<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.3" name="com.thirdparty.mq.ra">
    <resources>
        <resource-root path="."/>
        <resource-root path="thirdparty-jms-provider.jar"/>
        ...
        <resource-root path="thirdparty-lib.jar"/>
    </resources>
    <dependencies>
        <module name="com.company.model"/>
        <module name="javax.api"/>
        <module name="javax.jms.api"/>
        <module name="javax.transaction.api"/>
        <module name="javax.management.j2ee.api"/>  
        <module name="javax.resource.api"/>
        <module name="org.jboss.invocation"/>
        <module name="org.jboss.remote-naming" optional="true"/>
        <module name="org.slf4j"/>
    </dependencies>
</module>

运行时出现以下异常:

Caused by: java.lang.ClassCastException: com.company.model.web.dto.WebAuthenticationResponse cannot be cast to com.company.model.web.dto.WebAuthenticationResponse

我怀疑这是一个类加载器问题。我必须在 module.xml 或 jboss-deployment-structure.xml 文件中指定一些额外的信息吗?

感谢您的帮助!

【问题讨论】:

  • 这可能是类路径中 com.company.model.web.dto.WebAuthenticationResponse 的两个(或多个)版本之间的冲突。你能检查一下你的类路径中有什么吗?
  • 如何检查 Wildfly 类路径? Wildfly 在运行时加载类,因此它们不会在执行命令中...?

标签: jboss classloader wildfly jboss-modules


【解决方案1】:

假设您的 model.jar 对应于您的 com.company.model 模块,您的 WAR 类加载器现在会看到模型类两次,分别来自 WEB-INF/lib 中自己的库和模块依赖项。

您应该导入或嵌入模块/库,但不能同时导入或嵌入两者。

顺便说一句,导入 RAR 模块看起来有点可疑。您永远不应该依赖资源适配器的实现。也许您可以分解出一个 API 模块并导入它。

【讨论】:

  • 这不是人们在 Wildfly 安装中使用 ActiveMQ 的方式吗?通过创建一个 activemq 模块并将其导入他们的项目?还是他们将 activemq 设置为默认的 JMS 提供程序?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多