有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Karaf中的java XML解析器类加载问题

我有一个OSGi包,可以执行一些LDAP操作。它使用Apache共享目录来执行这些操作。我正在使用Maven Bundle插件构建我的Bundle。由于缺乏时间和资源,我不得不参加pom。xml,包括Apache共享目录和它所依赖的其他JAR,在生成的包中。其中一个依赖项是Xerces,其次是XMLAPI。当我在包中包含这两个罐子时,Karaf抛出一个ClassCastException:

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

进一步的调查显示类javax.xml.parsers.DocumentBuilderFactory是从我的包中包含的两个JAR-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) 个答案

  1. # 1 楼答案

    导入包javax.xml.parsers

  2. # 2 楼答案

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

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

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

    在我的案例中,解决方案是使用旧版本的xerces(lucene xercesImpl),并排除对xerces的xml API的任何引用:

    <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>
    

    希望这有帮助

  3. # 3 楼答案

    你试过评论这句话吗

    javax.xml.parsers, \

    在etc/jre中。属性文件?这将防止从rt.jar加载类