2013-07-26 31 views
5

Tôi nhận được lỗi sau đây trong môi trường OSGi tôi:Giải quyết lỗi "nạp hạn chế vi phạm" trên "org.w3c.dom.Node" trong một môi trường 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) 

Vấn đề là bó nơi cuộc gọi này xuất phát từ nhập khẩu org.w3c.dom.Node

(từ "xml-apis" bó), vì đây là kiểu trả về của phương pháp getAsTree(String formatName) của javax.imageio.metadata.IIOMetadata, trong khi lớp này tự nhập khẩu org.w3c.dom.Node từ gói hệ thống, bởi vì nó nằm trong gói hệ thống.

Điều này dẫn đến org.w3c.dom.Node được tải bởi hai trình nạp lớp khác nhau và do đó vi phạm ràng buộc trình tải hiển thị ở trên, khi phương thức getAsTree được gọi. Cần có gói "xml-apis" trong môi trường OSGi này vì nó cung cấp phiên bản khác nhau của gói org.w3c.dom so với gói hệ thống được sử dụng bởi các gói khác trong môi trường của tôi), nhưng không tồn tại trong gói hệ thống).

Gói javax.imageio không có sẵn trong một gói riêng biệt, vì vậy tôi không thể "buộc" gói đó để sử dụng nhập "xml-apis". Tôi cũng đã cố gắng nhập phiên bản "0.0.0" (gói hệ thống 'phiên bản') của org.w3c.dom vào gói gọi, nhưng điều này không hoạt động, vì điều này dẫn đến "gói sử dụng xung đột" trên các hàng nhập khác (có org.w3c.dom làm hạn chế sử dụng).

Tôi hiện có một chút ý tưởng. Có ai có một ý tưởng làm thế nào tôi có thể khắc phục vấn đề này? Cảm ơn bạn rất nhiều vì sự giúp đỡ của bạn trước!

+1

Tôi đã có vấn đề tương tự vì vậy tôi di chuyển nhiều xml lớp liên quan thành một bó có sẵn tại https://repository.everit.biz/nexus/content/groups/public/org/everit/osgi/bundles/org.everit.osgi.bundles.org.apache.xmlcommons.full/1.4.1/. Sau đó tôi đã gỡ bỏ các gói javax.xml đã có trong gói này từ đường dẫn lớp khởi động osgi. Vì mọi thứ dường như hoạt động tốt. –

+0

Cảm ơn bạn đã đề xuất của bạn, tôi sẽ cố gắng! – arjenh

+0

@Balazs: Việc sử dụng gói đó không giải quyết được lỗi, vì vẫn có hai trình nạp lớp khác nhau đang cố gắng tải org.w3c.dom.Node. Câu trả lời của Peter dưới đây sửa lỗi đó. Nhờ đề nghị mặc dù! – arjenh

Trả lời

4

Một khả năng (khá dễ dàng trong thực tế trong bnd (công cụ)) là đặt gói API XML trên đường dẫn lớp thông thường. Giả sử tệp javax.xml mới. * Tương thích ngược, bạn sẽ nhận được ít nhất một định nghĩa về các API này. Trong bndtools bạn sẽ thêm:

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

Bạn cũng sẽ phải thêm các gói hệ thống bổ sung sau đó.

Tất nhiên vấn đề thực sự là Java không phiên bản gói của nó, để lại bạn với đống lộn xộn này ...

+0

Cảm ơn, hoạt động rất tốt! Trường hợp này thực sự làm cho nó dồi dào rõ ràng chúng ta cần phiên bản của các gói trong JRE. Cảm thấy khó xử để workaround rằng như thế này, hy vọng rằng phiên bản sẽ đến sớm! – arjenh

Các vấn đề liên quan