我正在使用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)
时
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.xml
有com.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
在我的组织中共享,我无法改变它。
那我怎么解决这个问题呢?感谢任何帮助。
答案 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