我有一个从Java 8移植到Java 11的基于Eclipse的应用程序。由于javax.xml
和朋友已从JDK中删除,因此我必须将其作为导入包添加到每个该插件中。需要他们。
现在,当运行此代码时
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上运行。
如何解决此异常?
答案 0 :(得分:0)
我们找到了OSGi兼容的方法来解决此异常:
org.apache.servicemix.specs.jaxb-api-2.2
(来自Maven中心)com.sun.xml.bind
(来自Eclipse平台;这是包含ContextFactory
的那个)因此在Tycho中,它看起来像这样:
<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>
答案 1 :(得分:-1)
我也在应用程序(JMSToolBox)中使用jaxb,并且也从Java 1.8迁移到Java 11,没有出现此问题
在我的插件中,我有一个带有"jaxb-ri"
jar及其依赖项(来自maven)的“ lib”目录:
然后插件引用了那些jars(MANIFEST.MF + build.properties),我没有任何问题
插件is here