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
。有没有办法解决这个问题?任何帮助都将不胜感激
# 1 楼答案
导入包
javax.xml.parsers
# 2 楼答案
问题解决了!!(至少对我来说)
您可以在该链接中找到关于该问题的非常好的解释: Dealing with "Xerces hell" in Java/Maven?
正如你所看到的,实际上,这是Xerces兼容性的问题。也许您不使用Xerces,但可能您正在使用使用Xerces的库
在我的案例中,解决方案是使用旧版本的xerces(lucene xercesImpl),并排除对xerces的xml API的任何引用:
希望这有帮助
# 3 楼答案
你试过评论这句话吗
在etc/jre中。属性文件?这将防止从rt.jar加载类