在 Eclipse 中找不到 ContextFactory

ContextFactory cannot be found in Eclipse

我有一个基于 Eclipse 的应用程序正在从 Java 8 移植到 Java 11。由于 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 本身不应该能够 运行 on Java 11.

如何修复此异常?

我也在我的应用程序中使用 jaxb (JMSToolBox) 并且也从 Java 1.8 迁移到 Java 11 并且没有遇到这个问题
在我的插件中,我有一个 "lib" 目录,其中包含 "jaxb-ri"jar 及其依赖项(来自 maven):

  • 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

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

插件is here

我们找到了修复此异常的 OSGi 兼容方法:

  1. 将以下实现添加到目标平台
    • org.apache.servicemix.specs.jaxb-api-2.2(来自 Maven 中心)
    • com.sun.xml.bind(来自 Eclipse 平台;这是包含 ContextFactory 的平台)
  2. 确保这些包与您的应用程序一起启动
  3. 确保 Apache 包在其他一切之前启动

所以在第谷中,这看起来像这样:

                <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>