4

以下のコマンドを実行して、CLI 経由で OSGi フレームワークを実行しています。

java -jar org.eclipse.osgi_3.6.2.R36x_v20110210.jar -コンソール

プラグインは正常に動作しますが、xml ファイルを解析するためにシステム ライブラリ (JavaSE1.6.xx) の JAXB パッケージを必要とするプラグインを実行しているときに、以下のような例外トレースが発生します。

Exception in thread "DummyProgram" java.lang.ExceptionInInitializerError
        at javax.xml.bind.DatatypeConverter.<clinit>(DatatypeConverter.java:78)
        at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl$3.run(JAXBContextImpl.java:262)
        at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl$3.run(JAXBContextImpl.java:260)
        at java.security.AccessController.doPrivileged(Native Method)
        at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:260)
        at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(JAXBContextImpl.java:1100)
        at com.sun.xml.internal.bind.v2.ContextFactory.createContext(ContextFactory.java:143)
        at com.sun.xml.internal.bind.v2.ContextFactory.createContext(ContextFactory.java:110)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:202)
        at javax.xml.bind.ContextFinder.find(ContextFinder.java:376)
        at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:574)
        at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:522)
        at com.entities.conf.JAXBMTSConfig.unmarshalApps(JAXBMTSConfig.java:113)
        20 more..
Caused by: java.lang.ClassCastException: org.apache.xerces.jaxp.datatype.DatatypeFactoryImpl cannot be cast to javax.xml.datatype.DatatypeFactory
        at javax.xml.datatype.DatatypeFactory.newInstance(Unknown Source)
        at javax.xml.bind.DatatypeConverterImpl.<clinit>(DatatypeConverterImpl.java:742)
4

2 に答える 2

1

javax.xml.bind.*異なるバージョンのパッケージとの競合があると思います。それらはシステムライブラリとxerces(?)jarによってエクスポートされると思いますか?

したがって、どのバンドルがそれらのパッケージをエクスポートするかを調べて、競合を解決する必要があります。

よろしく、フランク

于 2012-12-07T10:04:22.420 に答える
1

OSGi でのクラスキャスト例外は、通常、すべてのバンドルに独自のクラス ローダーがあるという事実によって発生します。2 つのバンドルが他のソースから同じクラスをロードする可能性があります (2 回エクスポートされるため)。すべてのバンドルには独自のクラス ローダーがあるため、それらは 2 つの異なるクラス ローダーによってロードされるため、Java はこれを同じクラスとして受け入れません。

2 つの回避策があります。 - クラスが 2 回エクスポートされているかどうかを確認します。この場合は、一度だけエクスポートして解決してください。バンドル a にはバージョン 1.4 が必要で、バンドル b には 1.7 が必要な場合があるため、これは不可能な場合があります。

  • この場合、エクスポートされたクラスをバンドルにインポートします。例: バンドル A は xyz-1.4 をエクスポートし、xyz-1.4 をインポートします。 バンドル B は xyz-1.7 をエクスポートし、xyz-1.7 をインポートします。

フレームワークは、使用するクラスを決定できるようになりました。バンドルが単独で実行される場合、1.4 が使用されます。それ以外の場合、バンドル A と B がバンドル C に必要であり、1.7 が使用されます (1.4 との下位互換性がある場合)。

于 2012-12-07T10:25:02.460 に答える