我通过运行命令运行OSGi框架,如下所示:
java -jar org.eclipse.osgi_3.6.2.R36x_v20110210.jar -console
我的插件运行正常,但在运行我的插件时,需要系统库(JavaSE1.6.xx)的JAXB包来解析xml文件,我得到异常跟踪,如下所示:
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)
答案 0 :(得分:1)
我认为与javax.xml.bind.*
个软件包的不同版本存在冲突。我猜他们是由系统库和导出的xerces(?)jar?
因此,您需要找出哪个捆绑包导出这些包,并解决冲突。
问候,弗兰克
答案 1 :(得分:1)
OSGi中的类转换异常通常是由每个bundle都有自己的类加载器这一事实引起的。 两个bundle可能从其他源加载相同的类(因为它们被导出两次)。因为每个bundle都有自己的类加载器,所以它们由两个不同的类加载器加载,因此java不接受它作为同一个类。
有两种解决方法: - 检查类是否导出两次。如果是这种情况,请尝试通过仅导出一次来解决此问题。 这可能是不可能的,因为bundle a可能需要版本1.4,而bundle b 1.7。
现在框架可以决定使用哪个类。如果bundle a单独运行,则将使用1.4。 否则,Bundle C需要捆绑A和B,将使用1.7(如果它向下兼容1.4)