`
lucene3212
  • 浏览: 132538 次
  • 性别: Icon_minigender_2
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

一次jboss中部署应用时类版本冲突问题分析、解决过程

    博客分类:
  • java
阅读更多
    去年同事的一个项目在jboss中部署时遇到类版本冲突问题,当时协助他处理了此问题,现在将当时处理的过程记录一下,以备以后参考使用。错误日志如下:
2010-12-13 17:06:00,101 error [stderr] exception in thread "defaultquartzscheduler_worker-1" 2010-12-13 17:06:00,101 error [stderr] java.lang.nosuchmethoderror: org.codehaus.jettison.abstractxmlstreamwriter.getserializedasarrays()ljava/util/arraylist;2010-12-13 17:06:00,101 error [stderr]  at com.thoughtworks.xstream.io.json.jettisonstaxwriter.startnode(jettisonstaxwriter.java:71)2010-12-13 17:06:00,101 error [stderr]  at com.thoughtworks.xstream.io.writerwrapper.startnode(writerwrapper.java:33)2010-12-13 17:06:00,101 error [stderr]  at com.thoughtworks.xstream.io.path.pathtrackingwriter.startnode(pathtrackingwriter.java:44)2010-12-13 17:06:00,101 error [stderr]  at com.thoughtworks.xstream.io.extendedhierarchicalstreamwriterhelper.startnode(extendedhierarchicalstreamwriterhelper.java:17)2010-12-13 17:06:00,101 error [stderr]  at com.thoughtworks.xstream.core.treemarshaller.start(treemarshaller.java:96)2010-12-13 17:06:00,101 error [stderr]  at com.thoughtworks.xstream.core.abstracttreemarshallingstrategy.marshal(abstracttreemarshallingstrategy.java:38)2010-12-13 17:06:00,101 error [stderr]  at com.thoughtworks.xstream.xstream.marshal(xstream.java:837)2010-12-13 17:06:00,102 error [stderr]  at com.thoughtworks.xstream.xstream.marshal(xstream.java:826)2010-12-13 17:06:00,102 error [stderr]  at com.thoughtworks.xstream.xstream.toxml(xstream.java:801)2010-12-13 17:06:00,102 error [stderr]  at com.thoughtworks.xstream.xstream.toxml(xstream.java:789)2010-12-13 17:06:00,102 error [stderr]  at org.springframework.batch.core.repository.dao.xstreamexecutioncontextstringserializer.serialize(xstreamexecutioncontextstringserializer.java:43)

    从上面的日志可以看出spring batch 依赖的jettison的abstractxmlstreamwriter类找不到getserializedasarrays(java.util.arraylist)方法。遇到这个问题,我们很自然的先检查一下xxxx-ear.ear/lib/codehaus.jettison-1.0.1.jar这个jar中的abstractxmlstreamwriter类是否符合要求,检查结果这个类存在getserializedasarrays(java.util.arraylist)方法。这样也就是说jboss没有加载到ear包中的类。
    下面我们来跟踪一下,看看应用究竟在那个jar里加载了abstractxmlstreamwriter类。首先我们需要修改一下jboss log4j的配置,这个配置的意思相信大家一看就了解了。
<appender name="ucl" class="org.apache.log4j.fileappender">        <param name="file" value="/home/sean/output/logs/user/ucl.log"/>        <layout class="org.apache.log4j.patternlayout">                <param name="conversionpattern" value="[%r,%c{1},%t] %m%n"/>        </layout>    </appender>    <category name="org.jboss.mx.loading" additivity="false">        <priority value="trace" class="org.jboss.logging.xlevel"></priority>        <appender-ref ref="ucl"></appender-ref>    </category> 
       
然后,我们查看ucl的日志可以看到下列信息
[10141,classloaderutils,main] indexed pkg: org.codehaus.jettison, ucl: org.jboss.mx.loading.unifiedclassloader3@1fe500a{ url=file:/home/sean/web-deploy/jboss_server/default/deploy/jbossws.sar/ ,addedorder=12}[10141,classloaderutils,main] indexed pkg: org.codehaus.jettison.badgerfish, ucl: org.jboss.mx.loading.unifiedclassloader3@1fe500a{ url=file:/home/sean/web-deploy/jboss_server/default/deploy/jbossws.sar/ ,addedorder=12}[10142,classloaderutils,main] indexed pkg: org.codehaus.jettison.json, ucl: org.jboss.mx.loading.unifiedclassloader3@1fe500a{ url=file:/home/sean/web-deploy/jboss_server/default/deploy/jbossws.sar/ ,addedorder=12}[10143,classloaderutils,main] indexed pkg: org.codehaus.jettison.mapped, ucl: org.jboss.mx.loading.unifiedclassloader3@1fe500a{ url=file:/home/sean/web-deploy/jboss_server/default/deploy/jbossws.sar/ ,addedorder=12}[10144,classloaderutils,main] indexed pkg: org.codehaus.jettison.util, ucl: org.jboss.mx.loading.unifiedclassloader3@1fe500a{ url=file:/home/sean/web-deploy/jboss_server/default/deploy/jbossws.sar/ ,addedorder=12}[10144,repositoryclassloader,main] added url: file:/home/sean/output/logs/jboss_stout/tmp/deploy/tmp8907418620370263381jettison.jar, to ucl: org.jboss.mx.loading.unifiedclassloader3@1fe500a{ url=file:/home/sean/web-deploy/jboss_server/default/deploy/jbossws.sar/ ,addedorder=12}

从上面的日志可以看出有个jettison.jar加到了这个ucl org.jboss.mx.loading.unifiedclassloader3@1fe500a中。从日志里还可以看到这个jar存在的路径是/home/sean/web-deploy/jboss_server/default/deploy/jbossws.sar/

再来看一段日志
[19814,classloaderutils,main] multiple class loaders found for pkg: org.codehaus.jettison.badgerfish[19814,classloaderutils,main] indexed pkg: org.codehaus.jettison.badgerfish, ucl: org.jboss.mx.loading.unifiedclassloader3@16274ea{ url=file:/home/sean/output/logs/jboss_stout/tmp/deploy/tmp7754042895360577419xxxx-ear.ear ,addedorder=45}[19814,classloaderutils,main] multiple class loaders found for pkg: org.codehaus.jettison[19814,classloaderutils,main] indexed pkg: org.codehaus.jettison, ucl: org.jboss.mx.loading.unifiedclassloader3@16274ea{ url=file:/home/sean/output/logs/jboss_stout/tmp/deploy/tmp7754042895360577419xxxx-ear.ear ,addedorder=45}[19814,classloaderutils,main] multiple class loaders found for pkg: org.codehaus.jettison.json[19814,classloaderutils,main] indexed pkg: org.codehaus.jettison.json, ucl: org.jboss.mx.loading.unifiedclassloader3@16274ea{ url=file:/home/sean/output/logs/jboss_stout/tmp/deploy/tmp7754042895360577419xxxx-ear.ear ,addedorder=45}[19815,classloaderutils,main] multiple class loaders found for pkg: org.codehaus.jettison.util[19815,classloaderutils,main] indexed pkg: org.codehaus.jettison.util, ucl: org.jboss.mx.loading.unifiedclassloader3@16274ea{ url=file:/home/sean/output/logs/jboss_stout/tmp/deploy/tmp7754042895360577419xxxx-ear.ear ,addedorder=45}[19815,classloaderutils,main] multiple class loaders found for pkg: org.codehaus.jettison.mapped[19815,classloaderutils,main] indexed pkg: org.codehaus.jettison.mapped, ucl: org.jboss.mx.loading.unifiedclassloader3@16274ea{ url=file:/home/sean/output/logs/jboss_stout/tmp/deploy/tmp7754042895360577419xxxx-ear.ear ,addedorder=45}[19816,repositoryclassloader,main] added url: file:/home/sean/output/logs/jboss_stout/tmp/deploy/tmp7754042895360577419xxxx-ear.ear-contents/lib/codehaus.jettison-1.0.1.jar, to ucl: org.jboss.mx.loading.unifiedclassloader3@16274ea{ url=file:/home/sean/output/logs/jboss_stout/tmp/deploy/tmp7754042895360577419xxxx-ear.ear ,addedorder=45}

从上面的日志可以看到又有一个codehaus.jettison-1.0.1.jar加到了这个ucl org.jboss.mx.loading.unifiedclassloader3@16274ea中这个是我们应用自己的jar(xxxx-ear.ear-contents/lib/codehaus.jettison-1.0.1.jar,)
        
在应用加载abstractxmlstreamwriter类时出现了如下日志
[70806,repositoryclassloader,defaultquartzscheduler_worker-9] loadclass org.jboss.mx.loading.unifiedclassloader3@1fe500a{ url=file:/home/sean/web-deploy/jboss_server/default/deploy/jbossws.sar/ ,addedorder=12} name=org.codehaus.jettison.abstractxmlstreamwriter class=class org.codehaus.jettison.abstractxmlstreamwriter cl=org.jboss.mx.loading.unifiedclassloader3@1fe500a{ url=file:/home/sean/web-deploy/jboss_server/default/deploy/jbossws.sar/ ,addedorder=12}

    从这个日志中我们可以看出来abstractxmlstreamwriter是从org.jboss.mx.loading.unifiedclassloader3@1fe500a中加载到的也就是说这个class来自/home/sean/web-deploy/jboss_server/default/deploy/jbossws.sar/下的jettison.jar中,根本就不是应用想要的类。

    为什么会出现上面这样的情况呢???
    这就要从jboss的类加载机制说起。请查看我以前写的一篇关于jboss classloader的分析文章

分析了问题的原因之后,我们来看一下如何解决此问题
参考这里http://community.jboss.org/wiki/jbossclassloadingusecases的介绍,我一开始是参考case 3的做法将ear的repository和应用服务器中的默认的repository进行隔离。实现如下结构

<div class="quote_title">引用
0
11
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics