【问题标题】:XML Parser Class loading issues in KarafKaraf 中的 XML 解析器类加载问题
【发布时间】:2012-11-17 17:58:28
【问题描述】:

我有一个执行一些 LDAP 操作的 OSGi 包。它使用 Apache 共享目录来执行这些操作。我正在使用 Maven Bundle Plugin 来构建我的包。由于时间和资源不足,我不得不在生成的包中使用 pom.xml,其中包括 Apache 共享目录和它所依赖的其他 jar。依赖项之一是 Xerces,然后是 Xml api。当我将这两个 jar 包包含在包中时,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。有没有办法解决这个问题?任何帮助将不胜感激。

【问题讨论】:

    标签: java osgi classloader apache-karaf


    【解决方案1】:

    导入包javax.xml.parsers

    【讨论】:

    • 感谢您回答我的问题。我正在导入 javax.xml.parsers 包。 <Import-Package> javax.net, javax.net.ssl, javax.xml.*, javax.api.*, javax.xml.parsers,。似乎没有帮助。无论如何,谢谢。
    • @JohnSmith:你看过生成的清单了吗?它真的导入了这个包吗?如果是这样,那么这意味着他可以解决这个包(否则你会得到一个不同的错误),但是那个包不包含这个类。
    【解决方案2】:

    您是否尝试过注释掉这一行

    javax.xml.parsers,\

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

    【讨论】:

      【解决方案3】:

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

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

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

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

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

      希望对您有所帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-07-13
        • 2017-02-06
        • 1970-01-01
        • 2012-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多