JBOSS 6.3.0的类加载问题

时间:2016-01-25 19:36:30

标签: java spring jboss web-deployment jboss-eap-6

我正在使用JBOSS运行以下类加载问题。

我的JBOSS的module.xml:

<module xmlns="urn:jboss:module:1.0" name="com.example">
  <resources>
        ...
        <resource-root path="spring-amqp-1.4.6.RELEASE.jar"/>
        ...
  </resources>  
</module>

调用org.springframework.amqp.support.converter.DefaultJackson2JavaTypeMapper:getClassIdType(String classId)

引发了{p> MessageConversionException: failed to resolve class name...
ClassUtils.forName(classId, getClass()
          .getClassLoader())

调试getClass().getClassLoader()会返回ModuleClassLoader for Module "com.example:main".

所以似乎问题是我反序列化的类不在模块com.example中(在module.xml中定义)所以它会抛出异常

我的jboss-deployment-structure.xmlcom.example作为依赖:

 <dependencies>
            <module name="com.example">
                <imports>
                    <include path="META-INF**"/>
                </imports>
            </module>
        </dependencies>

如果我从spring-amqp-1.4.6.RELEASE.jar删除module.xml并将spring-amqp添加到build.gradle,我可以解决此问题。问题是module.xml在我的组织中共享,我无法改变它。

那我怎么解决这个问题呢?感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

要重现的堆栈跟踪(以及更多代码)会很好。我不熟悉amqp。

在第56行的https://github.com/spring-projects/spring-amqp/blob/master/spring-amqp/src/main/java/org/springframework/amqp/support/converter/DefaultJackson2JavaTypeMapper.java中,调用ClassUtils.forName(classId,getClass()。getClassLoader()),但无法找到该类。

在JBoss中,模块类加载器与应用程序类加载器分开。在您的应用程序中,您可以访问模块中的所有类,但模块无法访问您的WAR或JAR类。 因此,抛出异常,因为您的模块尝试从应用程序加载一个类,这在模块类加载器中是不可见的。但是如果你将amqp-jar添加到你的应用程序中,它就可以工作,因为它们共享同一个类加载器。

如果您希望/需要模块中的amqp,则需要使用应用程序公共类创建一个模块,并将其作为依赖项添加到模块中。但请注意,您不能再将common.jar添加到application.jar以避免classCastExceptions。 我不知道如何使用amqp,但可能需要创建多个模块才能将它与不同的common.jars一起使用。

有关jboss类加载的更多信息,我可以推荐你: http://www.mastertheboss.com/jboss-server/jboss-as-7/discover-jboss-as-7-modularity https://access.redhat.com/documentation/en-US/JBoss_Enterprise_Application_Platform/6/html/Development_Guide/chap-Class_Loading_and_Modules.html