4

我通过 CLI 运行 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)
4

2 回答 2

1

javax.xml.bind.*我认为与不同版本的软件包存在冲突。我猜它们是由系统库xerces (?) jar 导出的?

因此,您需要找出哪些包导出了这些包,并解决冲突。

问候,弗兰克

于 2012-12-07T10:04:22.420 回答
1

OSGi 中的类转换异常通常是由于每个包都有自己的类加载器这一事实引起的。两个包可能从其他来源加载相同的类(因为它们被导出两次)。因为每个包都有自己的类加载器,它们由两个不同的类加载器加载,所以 java 不接受它作为同一个类。

有两种解决方法: - 检查类是否被导出两次。如果是这种情况,请尝试通过仅导出一次来解决此问题。这可能是不可能的,因为 bundle a 可能需要 1.4 版本,而 bundle b 可能需要 1.7。

  • 如果是这种情况,请在包中导入导出的类。因此,例如: Bundle A 导出 xyz-1.4 并导入 xyz-1.4 Bundle B 导出 xyz-1.7 并导入 xyz-1.7

现在框架可以决定使用哪个类。如果 bundle a 单独运行,将使用 1.4。否则,Bundle C 需要 Bundle A 和 B,将使用 1.7(如果它向下兼容到 1.4)

于 2012-12-07T10:25:02.460 回答