在Eclipse中找不到ContextFactory

时间:2019-02-15 08:30:39

标签: eclipse-plugin eclipse-rcp

我有一个从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上运行。

如何解决此异常?

2 个答案:

答案 0 :(得分:0)

我们找到了OSGi兼容的方法来解决此异常:

  1. 将以下实现添加到目标平台
    • org.apache.servicemix.specs.jaxb-api-2.2(来自Maven中心)
    • com.sun.xml.bind(来自Eclipse平台;这是包含ContextFactory的那个)
  2. 确保这些捆绑包是从您的应用程序启动的
  3. 确保先启动Apache捆绑包

因此在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”目录:

  • jaxb-api-2.3.1.jar
  • jaxb-runtime-2.3.2.jar
  • javax.activation-api-1.2.0.jar
  • istack-commons-runtime-3.0.7.jar

然后插件引用了那些jars(MANIFEST.MF + build.properties),我没有任何问题

插件is here