博客园  :: 首页  :: 联系 :: 订阅 订阅  :: 管理

   最近在写JIRA插件,需要用到dom4j解析XML文件作为输入源。

      所以,毫不犹豫在pom.xml里面加上了:

<dependency>
    <groupId>dom4j</groupId>
    <artifactId>dom4j</artifactId>
    <version>${dom4j.version}</version>
</dependency>
<dependency>
    <groupId>jaxen</groupId>
    <artifactId>jaxen</artifactId>
    <version>${jaxen.version}</version>
</dependency>

当atlas-debug --product jira --version 4.4.1启动Debug模式后,悲剧的出现了如下异常:

  java.lang.ClassCastException: org.apache.xerces.jaxp.SAXParserFactoryImpl cannot be cast to javax.xml.parsers.SAXParserFactory

根据经验,很可能ClassLoader加载时,有多个版本的xercesImpl.jar:
经过mvn dependency:tree分析,发现是由于dom4j依赖另外一个版本的xercesImpl引起的。
又通过eclipse里面对pom.xml提供的“Dependency Hierarchy”发现,JIRA本身也用到了dom4j。
到这里,解决办法有了:“不用额外在pom.xml中申明对dom4j的依赖”。

后记:
这里问题虽然解决了。
但是,记得JIRA Plugin的ClassLoader与JIRA CORE的ClassLoader不是一个(可能是分级的,类似IBM websphere的那种ClassLoader父子机制),为什么会出现这种异常呢?
如果下次因为某种情况,必须使用xercesImpl的另一个版本,该怎么处理呢?

等有时间,一定得抽时间研究一下JIRA ClassLoader的机制。