2

我有一个执行一些 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. 有没有办法解决这个问题?任何帮助,将不胜感激。

4

3 回答 3

2

导入包javax.xml.parsers

于 2012-11-30T08:27:16.743 回答
0

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

您可以在此链接中找到对问题的很好解释: 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>

希望这有帮助!

于 2013-09-17T05:59:58.007 回答
0

你试过注释掉这条线吗

javax.xml.parsers,\

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

于 2013-02-14T16:36:56.583 回答