2012-12-07 43 views
4

我通過命令行運行如下命令運行OSGi框架:越來越ClassCastException異常在獨立的OSGi框架,JAXB

Java的罐子org.eclipse.osgi_3.6.2.R36x_v20110210.jar -console

我的插件運行正常,但在運行我的插件,需要系統庫(JavaSE1.6.xx)來解析xml文件我得到如下異常跟蹤的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) 

回答

1

我認爲有不同版本的衝突javax.xml.bind.*包。我猜他們是由系統庫一個xerces(?)jar導出的?

所以你需要找出哪些包導出這些軟件包,以及解決衝突。

問候,弗蘭克

+0

嗨,感謝您的回覆... 現在我已經包含了xerces JAR和rt JAR到另一個插件 並導出這些軟件包,除了javax.xml.datatype, ,並用所有插件連接起來。 因此,它工作正常,但我們知道,這不是一個好的方法來包括JRE系統庫罐到我們的osgi插件.. 有沒有其他更好的方法來滿足運行時JRE導入的需求,當我們運行OSGi框架「外部Eclipse」..? –

+0

Patel,我面臨着同樣的問題,我無法理解你做了什麼,你可以寫一個答案,解決問題的所有步驟。我會很感激,我真的認爲它會幫助別人。 –

1

在OSGi的一類強制轉換異常通常是由這樣的事實引起的,每束有它自己的類加載器。 有可能兩個bundle從其他來源加載相同的類(因爲它們被導出兩次)。因爲每個bundle都有自己的類加載器,所以它們由兩個不同的類加載器加載,所以java不接受它作爲同一個類。

有兩種解決方法: - 檢查類是出口的兩倍。如果是這種情況,請嘗試通過僅導出一次來解決此問題。 這可能是不可能的,因爲bundle a可能需要版本1.4,捆綁b 1.7。

  • 如果是這種情況,請將導出的類導入到包中。 因此,例如: 捆綁出口XYZ-1.4和進口XYZ-1.4 捆B出口XYZ-1.7和進口XYZ-1.7

現在的框架可以決定使用哪個類。如果bundle a單獨運行,將使用1.4。 否則,捆綁包A和B需要一個捆綁包C,將使用1.7(如果它向下兼容到1.4)