在 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 兼容方法:
- 将以下实现添加到目标平台
org.apache.servicemix.specs.jaxb-api-2.2
(来自 Maven 中心)
com.sun.xml.bind
(来自 Eclipse 平台;这是包含 ContextFactory
的平台)
- 确保这些包与您的应用程序一起启动
- 确保 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>
我有一个基于 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 兼容方法:
- 将以下实现添加到目标平台
org.apache.servicemix.specs.jaxb-api-2.2
(来自 Maven 中心)com.sun.xml.bind
(来自 Eclipse 平台;这是包含ContextFactory
的平台)
- 确保这些包与您的应用程序一起启动
- 确保 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>