我有一个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
。有没有办法可以解决这个问题?任何帮助将不胜感激。
答案 0 :(得分:2)
导入包javax.xml.parsers
。
答案 1 :(得分:0)
您是否尝试过评论
在etc / jre.properties文件中?这应该可以防止从rt.jar加载类。javax.xml.parsers,\
答案 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>
希望这有帮助!