2013-07-26 3 views
5

Я получаю следующее сообщение об ошибке в моей OSGi среде:Решение ошибки «Загрузчик нарушение ограничений» на «org.w3c.dom.Node» в 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.

В «XML-APIs» расслоение необходимо в этом OSGi-среде, поскольку она обеспечивает другую версию org.w3c.dom пакета, чем система пачка (например, org.w3c.dom.ElementTraversal класса можно найти в разделе «XML-APIs» расслоении (и используется другими связями в моей среде), но не существует в системном комплекте).

Пакет javax.imageio не доступен в отдельном комплекте, поэтому я не могу «заставить» его использовать импорт «xml-apis». Я также попытался явно импортировать версию «0.0.0» (системный пакет «версия») org.w3c.dom в вызывающем пакете, но это тоже не работает, потому что это приводит к тому, что «использование пакетов использует конфликты» для других импортных org.w3c.dom как используется ограничение).

Я немного из идей прямо сейчас. Кто-нибудь есть идея, как я могу решить эту проблему? Большое вам спасибо за вашу помощь заранее!

+1

Я имел аналогичные проблемы, так что я переехал многие из XML-связанного классов в наличный один пучок на HTTPS://repository.everit.biz/nexus/content/groups/public/org/everit/osgi/bundles/org.everit.osgi.bundles.org.apache.xmlcommons.full/1.4.1/. После этого я удалил пакеты javax.xml, которые уже находятся в этом пакете из пути класса загрузки osgi. С тех пор все работает хорошо. –

+0

Спасибо за ваше предложение, я попробую! – arjenh

+0

@Balazs: Использование этого пакета не устранило ошибку, к сожалению, так как существовали еще два разных загрузчика классов, пытающихся загрузить org.w3c.dom.Node. Ниже приводится ответ Питера. Спасибо за предложение! – arjenh

ответ

4

Одна из возможностей (довольно простая на практике в bnd (tools)) заключается в размещении пакета XML API в обычном пути к классам. Предполагая, что новый javax.xml. * Обратно совместим, вы получите хотя бы одно определение этих API. В bndtools вы добавили бы:

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

Вам также необходимо будет добавить дополнительные системные пакеты.

Конечно реальная проблема заключается в том, что Java не версии своих пакетов, оставив вас с этой кашей ...

+0

Спасибо, что работает блестяще! В этом случае действительно ясно, что нам нужно управлять версиями пакетов в JRE. Чувствует себя неудобно обходить это так, надеюсь, что версия будет скоро! – arjenh