6

我的 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

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

这导致org.w3c.dom.Node被两个不同的类加载器加载,因此在getAsTree调用该方法时会导致上面显示的加载器约束冲突。

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

javax.imageio软件包在单独的捆绑包中不可用,因此我不能“强制”它使用“xml-apis”导入。我还尝试org.w3c.dom在调用 bundle 中显式导入版本“0.0.0”(系统捆绑“版本”),但这也不起作用,因为这会导致其他导入(具有org.w3c.domas uses约束)。

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

4

1 回答 1

4

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

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

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

当然,真正的问题是 Java 没有对其包进行版本控制,这让你陷入了混乱......

于 2013-07-29T08:11:44.597 回答