我正在尝试在Eclipse RCP应用程序中使用Xerces 2.11.0,但是从我尝试的所有内容中,我无法弄清楚如何使用它。更复杂的是,我也试图使用Batik 1.7。
我已经为Xerces和xml-apis创建了自己的包,我已经添加了Batik使用的附加W3C DOM接口到我的xml-apis包。
Batik中出现的第一个问题
java.lang.NoClassDefFoundError: org/w3c/dom/ElementTraversal
这个的根本原因似乎是因为org.w3c.dom包含在JRE中并通过org.eclipse.osgi(system.bundle)公开。这似乎胜过任何其他想要提供包的包。
尝试在任何其他人之前使用require-bundle和我的包来影响系统,或者使用带有显式版本的import-package会导致错误,例如
java.lang.LinkageError: loader constraint violation: loader
(instance of org/eclipse/osgi/internal/baseadaptor/DefaultClassLoader)
previously initiated loading for a different type with name
"org/w3c/dom/Document"
更改 org.osgi.framework.system.packages 和 org.osgi.framework.bootdelegation 参数以删除org.w3c.dom并将我的包添加到< em> osgi.framework.extensions ,导致像
这样的错误java.lang.LinkageError: loader constraint violation in interface itable
initialization: when resolving method
"javax.xml.parsers.DocumentBuilder.setErrorHandler(
Lorg/xml/sax/ErrorHandler;)V" the class loader
(instance of org/eclipse/osgi/internal/baseadaptor/DefaultClassLoader)
of the current class, org/apache/log4j/xml/DOMConfigurator, and the
class loader (instance of <bootloader>) for resolved class,
javax/xml/parsers/DocumentBuilder, have different Class objects for the
type rrorHandler;)V used in the signature
我也尝试过使用java.endorsed.dirs,这会让事情很快发生。
我错过了什么或可能做错了什么?
答案 0 :(得分:1)
我们曾经在jdk 1.4上使用DOM级别3遇到过类似的问题,我认为认可的dirs是唯一有效的解决方案,因为你需要覆盖jdk中的DOM API。
我们无法再次面对这条路线,所以反而撕掉了对ElementTraversal的引用并手工构建了Xerces,问题就消失了。如果Batik使用的ElementTraversal不是一个选项。
答案 1 :(得分:0)
我想我找到了解决方案。
我修改了我的xml-apis包,使它成为一个片段,由system.bundle托管。
我还修改了我的Xerces包以导入包而不是需要xml-apis包(最初是为了说服xerces使用正确的包)。
从我已经完成的测试中,这似乎足以让每个bundle找到org.w3c.dom包的相同实现,包含所有正确的类。