为什么我的JBoss模块会抛出ClassCastException?

时间:2015-01-16 17:39:58

标签: jboss classloader wildfly jboss-modules

您好StackOverflow社区,

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

  1. 第三方JMS JCA适配器模块,
  2. 和模型模块(model.jar),其中包含用于在JMS代理和WAR之间进行通信的消息类
  3. 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文件中指定一些额外信息?

    感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

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

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

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