使用最新的Xerces和Eclipse RCP应用程序

时间:2012-10-09 11:26:54

标签: eclipse osgi eclipse-rcp xerces

我正在尝试在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,这会让事情很快发生。

我错过了什么或可能做错了什么?

2 个答案:

答案 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包的相同实现,包含所有正确的类。