2013-07-26 6 views
5

を「ローダー制約違反」エラーを解決:私はOSGi環境で次のエラーを取得していOSGi環境で「org.w3c.dom.Nodeの」上

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をインポートしながら、これは、javax.imageio.metadata.IIOMetadatagetAsTree(String formatName)メソッドの戻り型であるため、この呼び出しは、(「XML-APIの」バンドルから)輸入org.w3c.dom.Node

から来ていますシステムバンドル

getAsTreeメソッドが呼び出されると、これにより、org.w3c.dom.Nodeが2つの異なるクラスローダーによってロードされ、したがって上記のローダー制約違反が表示されます。

このOSGi環境では、システムバンドルとは異なるバージョンのorg.w3c.domが提供されているため、「xml-apis」バンドルが必要です(例:org.w3c.dom.ElementTraversalクラスは「xml-apis」バンドル私の環境では他のバンドルで使用されていますが、システムバンドルには存在しません)。

javax.imageioパッケージは別のバンドルでは使用できないため、「xml-apis」インポートを強制することはできません。 私はまた、明示的にバージョン "0.0.0"(システムバンドル 'バージョン')をorg.w3c.domの呼び出し元のバンドルにインポートしようとしましたが、これはうまく機能しません。これは他のインポートで "パッケージ使用競合"使用制限としてorg.w3c.dom)。

私はちょっと考えていません。誰も私がこの問題をどのように修正できるか考えていますか?事前にお手数をおかけしていただきありがとうございます。

+1

私がhttpsで利用できる1束にし、XML関連のクラスの多くを移動するので、私は同様の問題を抱えていました:/ /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:残念ながら、そのバンドルを使用しても、2つの異なるクラスローダーがorg.w3c.dom.Nodeをロードしようとしていたため、エラーを解決できませんでした。ピーターの答えは以下の通りです。しかし、提案をありがとう! – arjenh

答えて

4

XML APIバンドルを通常のクラスパスに配置することも可能です(実際にはbnd(tools)では非常に簡単です)。新しいjavax.xml。*が下位互換性があると仮定すると、これらのAPIの定義を少なくとも1つ取得します。 bndtoolsでは、次のように追加します:

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

また、余分なシステムパッケージを追加する必要があります。

もちろん、本当の問題は、この混乱であなたを残して、Javaのバージョンのパッケージをしないことです...

+0

ありがとう、それはすごくうまくいく!この場合、実際にJREのパッケージのバージョン管理が必要であることが十分に明らかになります。このような回避策には厄介な気がするが、すぐにバージョン管理が行われることを願っている! – arjenh

関連する問題