解决OSGi环境中“org.w3c.dom.Node”上的“加载器约束违规”错误

时间:2013-07-26 12:44:17

标签: java osgi classloader

我在OSGi环境中收到以下错误:

java.lang.LinkageError: loader constraint violation: loader (instance of <bootloader>) previously initiated loading for a different type with name "org/w3c/dom/Node"
    at javax.imageio.metadata.IIOMetadata.getStandardTree(IIOMetadata.java:716)
    at com.sun.imageio.plugins.gif.GIFImageMetadata.getAsTree(GIFImageMetadata.java:128)
    at com.xmlmind.fo.graphic.GraphicFactoryImpl.getResolution(GraphicFactoryImpl.java:184)
    at com.xmlmind.fo.graphic.GraphicFactoryImpl.createGraphic(GraphicFactoryImpl.java:145)
    at com.xmlmind.fo.graphic.GraphicFactories.createGraphic(GraphicFactories.java:128)
    at com.xmlmind.fo.converter.Converter.createGraphic(Converter.java:1943)
    at com.xmlmind.fo.converter.Converter.startExternalGraphic(Converter.java:1910)
    at com.xmlmind.fo.converter.Converter.startElement(Converter.java:635)
    at org.apache.xerces.parsers.AbstractSAXParser.startElement(Unknown Source)
    at org.apache.xerces.parsers.AbstractXMLDocumentParser.emptyElement(Unknown Source)
    at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source)
    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
    at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
    at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
    at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
    at org.apache.xerces.jaxp.SAXParserImpl.parse(Unknown Source)
    at com.xmlmind.fo.converter.Converter.convert(Converter.java:417)

问题在于此调用来自导入org.w3c.dom.Node

的捆绑包

(来自&#34; xml-apis&#34;捆绑包),因为这是getAsTree(String formatName) javax.imageio.metadata.IIOMetadata方法的返回类型,而此类本身导入org.w3c.dom.Node来自系统包,因为它驻留在系统包中。

当调用org.w3c.dom.Node方法时,这会导致getAsTree被两个不同的类加载器加载,从而导致上面显示的加载器约束违规。

&#34; xml-apis&#34; bundle在这个OSGi环境中是必需的,因为它提供了不同于系统包的org.w3c.dom包的版本(例如,org.w3c.dom.ElementTraversal类可以在&#34; xml-apis&#34;中找到。 bundle(并在我的环境中被其他bundle使用),但在系统包中不存在。)

javax.imageio软件包在单独的软件包中不可用,所以我不能强迫&#34;强制&#34;它使用&#34; xml-apis&#34;进口。 我也试过明确导入版本&#34; 0.0.0&#34; (调用包中org.w3c.dom的系统包&#39;版本&#39;)但这不起作用,因为这会导致&#34;包使用冲突&#34;在其他导入(使用org.w3c.dom作为使用约束)。

我现在有点想法了。有谁知道如何解决这个问题?非常感谢您的帮助!

1 个答案:

答案 0 :(得分:4)

一种可能性(事实上在bnd(工具)中非常容易)是将XML API包放在普通的类路径上。假设新的javax.xml。*是向后兼容的,您将至少获得这些API的一个定义。在bndtools中你会添加:

-runpath: ${repo;xml-apis__xml-apis} # assuming the bsn = xml-apis__xml-apis

您还必须添加额外的系统包。

当然真正的问题是Java不会对其软件包进行版本控制,让您陷入困境......