Karaf中的XML Parser Class加载问题

时间:2012-11-29 15:53:02

标签: java osgi classloader apache-karaf

我有一个OSGi包,可以执行一些LDAP操作。它使用Apache共享目录来执行这些操作。我正在使用Maven Bundle Plugin来构建我的包。由于时间和资源不足,我必须在生成的bundle中使用pom.xml,其中包括Apache Shared Directory和它所依赖的其他jar。其中一个依赖项是Xerces,其次是Xml apis。当我在捆绑包中包含这两个jar时,Karaf会抛出ClassCastException:

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

进一步的调查显示,课程javax.xml.parsers.DocumentBuilderFactory正在从我的捆绑包中加入的两个罐子Xml-apis.jar和JRE的rt.jar中加载,这导致ClassCastException 。由于此类是从rt.jar加载的,因此我认为我不需要在我的包中包含Xml-apis.jar并将其删除。但是,现在我看到了ClassNotFoundException

Caused by: java.lang.ClassNotFoundException: javax.xml.parsers.DocumentBuilderFactory not found by mybundle.ldap [149]
at org.apache.felix.framework.ModuleImpl.findClassOrResourceByDelegation(ModuleImpl.java:812)[org.apache.felix.framework-3.2.2.jar:]
at org.apache.felix.framework.ModuleImpl.access$400(ModuleImpl.java:72)[org.apache.felix.framework-3.2.2.jar:]
at org.apache.felix.framework.ModuleImpl$ModuleClassLoader.loadClass(ModuleImpl.java:1807)[org.apache.felix.framework-3.2.2.jar:]
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)[:1.6.0_35]

所以,如果我加入xml-apis.jar,我会得到ClassCastException。如果我不包括它,我会得到ClassNotFoundException。有没有办法可以解决这个问题?任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:2)

导入包javax.xml.parsers

答案 1 :(得分:0)

您是否尝试过评论

  

javax.xml.parsers,\

在etc / jre.properties文件中?这应该可以防止从rt.jar加载类。

答案 2 :(得分:0)

问题解决了!! (至少对我来说)

您可以在此链接中找到有关问题的非常好的解释: Dealing with "Xerces hell" in Java/Maven?

正如您所读到的,实际上,这是Xerces兼容性的问题。也许您不使用Xerces,但可能您使用的是使用Xerces的库。

我的解决方案是使用旧版本的xerces(lucene-xercesImpl)并排除对xml-apis oxerces的任何引用:

<properties>
   <ver.jena>2.10.1</ver.jena>
   <ver.jena-sdb>1.3.6</ver.jena-sdb>
   <ver.h2>1.3.173</ver.h2>
</properties>
<dependencies>
   <dependency>
      <groupId>org.apache.jena</groupId>
      <artifactId>jena-sdb</artifactId>
      <version>${ver.jena-sdb}</version>
      <exclusions>
         <exclusion>
            <groupId>xml-apis</groupId>
            <artifactId>xml-apis</artifactId>
         </exclusion>
         <exclusion>
            <groupId>xerces</groupId>
            <artifactId>xercesImpl</artifactId>
         </exclusion>
      </exclusions>
   </dependency>
   <dependency>
      <groupId>org.apache.lucene</groupId>
      <artifactId>lucene-xercesImpl</artifactId>
      <version>3.5.0</version>
   </dependency>
   <dependency>
      <groupId>org.apache.jena</groupId>
      <artifactId>apache-jena-libs</artifactId>
      <type>pom</type>
      <version>${ver.jena}</version>
      <exclusions>
         <exclusion>
            <artifactId>commons-codec</artifactId>
            <groupId>commons-codec</groupId>
         </exclusion>
         <exclusion>
            <groupId>org.apache.jena</groupId>
            <artifactId>jena-tdb</artifactId>
         </exclusion>
     </exclusions>
   </dependency>

希望这有帮助!