我有一个基于Eclipse的应用程序,它从Java 8移植到Java 11.由于javax.xml
和朋友从JDK中删除,我不得不将它作为Import-Package添加到需要它们的每个插件中。
但是,现在运行此代码时
Marshaller marshaller = JAXBContext.newInstance(MyClass.class).createMarshaller();
我得到以下异常:
java.lang.ClassNotFoundException: com.sun.xml.internal.bind.v2.ContextFactory
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
at org.eclipse.osgi.internal.framework.ContextFinder.loadClass(ContextFinder.java:135)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
at javax.xml.bind.ContextFinder.safeLoadClass(ContextFinder.java:480)
at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:184)
我可以添加com.sun.xml.bind
,它应该具有依赖性,但没有任何反应。这是可以理解的,因为OSGi规则可以防止通过反射侵入另一个插件。
但是我不能将Require-Bundle和Import-Package添加到JDK或javax.xml.bind
周围的包中。
There is a bug围绕这个问题,但我在评论中找不到我的应用程序的好解决方案。我仍然认为它可以为Eclipse应用程序修复,否则Eclipse本身不应该能够在Java 11上运行。
我该如何解决这个异常?
我们发现了一种OSGi兼容方法来修复此异常:
org.apache.servicemix.specs.jaxb-api-2.2
(来自Maven中心)
com.sun.xml.bind
(来自Eclipse平台;这是包含ContextFactory
的那个)所以在第谷,这看起来像这样:
<bundleStartLevel>
<bundle>
<id>org.apache.servicemix.specs.jaxb-api-2.2</id>
<autoStart>true</autoStart>
<level>1</level>
</bundle>
</bundleStartLevel>
<dependencies>
<dependency>
<artifactId>org.eclipse.e4.rcp</artifactId>
<type>eclipse-feature</type>
</dependency>
<dependency>
<type>p2-installable-unit</type>
<artifactId>org.apache.servicemix.specs.jaxb-api-2.2</artifactId>
</dependency>
<dependency>
<type>p2-installable-unit</type>
<artifactId>com.sun.xml.bind</artifactId>
</dependency>
</dependencies>
我在我的应用程序中使用jaxb(JMSToolBox)并且从Java 1.8迁移到Java 11并且没有遇到此问题
在我的插件中,我有一个带有"jaxb-ri"
jar及其依赖项(来自maven)的“lib”目录:
然后插件引用那些jar(MANIFEST.MF + build.properties),我没有任何问题
插件is here