Eclipse 4.12 - java.lang.ClassNotFoundException:com.sun.xml.internal.bind.v2.ContextFactory

问题描述 投票:0回答:8

我在运行 Eclipse 插件时收到以下错误。 Eclipse 使用 4.12 和 java11。它曾经在 eclipse 4.6.3 + java8 中工作正常。

javax.xml.bind.JAXBException: Provider com.sun.xml.internal.bind.v2.ContextFactory not found
 - with linked exception:
[java.lang.ClassNotFoundException: com.sun.xml.internal.bind.v2.ContextFactory cannot be found by com.my.cep.studio.cluster.topology_0.0.0]

!ENTRY com.my.cep.diagramming 4 0   at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:146)
    at javax.xml.bind.ContextFinder.find(ContextFinder.java:289)
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:412)
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:375)
    at com.my.cep.studio.cluster.topology.editors.ClusterTopologyDiagramManager.parseFile(ClusterTopologyDiagramManager.java:193)
    at com.my.cep.studio.cluster.topology.editors.ClusterTopologyDiagramManager.openModel(ClusterTopologyDiagramManager.java:175)
    at com.my.cep.diagramming.drawing.BaseDiagramManager.createDrawingCanvas(BaseDiagramManager.java:233)
    at com.my.cep.diagramming.drawing.DiagramManager$2.run(DiagramManager.java:259)
    at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:313)
    at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:770)
    at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
    at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
    at java.base/java.security.AccessController.doPrivileged(Native Method)
    at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
    at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:740)
    at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
    at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
    at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
    at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
    at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
Caused by: java.lang.ClassNotFoundException: com.sun.xml.internal.bind.v2.ContextFactory cannot be found by com.my.cep.studio.cluster.topology_0.0.0
    at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:512)
    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:423)
    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:415)
    at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:155)
    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:112)
java eclipse eclipse-plugin eclipse-rcp java-11
8个回答
68
投票

Sun 人们在 java 11 中删除了对 jaxb 包的直接访问。
这些依赖项将代替它起作用。如果您遇到休眠

NullPointerException
问题,请进行同样的修复。

    <dependency>
        <groupId>com.sun.xml.bind</groupId>
        <artifactId>jaxb-core</artifactId>
        <version>2.3.0.1</version>
    </dependency>
    <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <version>2.3.1</version>
    </dependency>
    <dependency>
        <groupId>com.sun.xml.bind</groupId>
        <artifactId>jaxb-impl</artifactId>
        <version>2.3.1</version>
    </dependency>
    <dependency>
        <groupId>org.javassist</groupId>
        <artifactId>javassist</artifactId>
        <version>3.25.0-GA</version>
    </dependency>
implementation 'com.sun.xml.bind:jaxb-core:2.3.0.1'
implementation 'javax.xml.bind:jaxb-api:2.3.1'
implementation 'com.sun.xml.bind:jaxb-impl:2.3.1'
implementation 'org.javassist:javassist:3.25.0-GA'

14
投票

我在将一个古老的 Java 应用程序迁移到 Java 11 时偶然发现了这个问题。我认为以下内容可能会很有用。

我的 Maven POM、javax 绑定、JAXB 实现中的所有内容都已准备就绪,一些测试运行良好。然而,原始应用程序的测试一直莫名其妙地抱怨找不到

com.sun.xml.internal.bind.v2.ContextFactory

事实上,该类不在 JAXB 的任何第三方实现中(我正在使用 Glassfish 的实现,但还有其他几个),并且必须用一些新的工厂替换在

javax.xml.bind.JAXBContext.newInstance( <classes> )
中实例化的默认工厂实现(
com.sun.xml.bind.v2.JAXBContextFactory
在我的例子中,我猜在其他 JAXB 库中也是如此)。

设置的方法之一是通过

jaxb.properties
文件,该文件必须对类路径可见(因此,在 Maven 中,它通常位于
src/main/resources/*
之类的位置)。正如here所解释的,该文件必须包含:

javax.xml.bind.context.factory=com.sun.xml.bind.v2.JAXBContextFactory

就我而言,它包含了现已消失的旧工厂。我猜想,当前的 JAXB 库如果不满足该文件,就会使用正确的默认工厂,但是它可能已经存在于您的代码库中,并且您可能需要一段时间才能意识到它。我希望这个答案能节省你我浪费的时间。


11
投票

是的,您正在使用 javax 中存在于 java 8 中但在 Java 11 中被删除的功能

看这个答案 如何解决 Java 9 中的 java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException


5
投票

这些库对我有用(受到上面 Vivek 回复的启发)。当我尝试将 Vogella 教程中的 JAXB 示例与 Intellij 一起使用时。

dependencies { testCompile group: 'junit', name: 'junit', version: '4.12' compile group: 'org.eclipse.persistence', name: 'org.eclipse.persistence.moxy',version: '2.7.3' compile group: 'javax.xml.bind', name: 'jaxb-api', version: '2.3.1' compile 'com.sun.xml.bind:jaxb-core:2.3.0.1' compile 'com.sun.xml.bind:jaxb-impl:2.3.1' compile 'org.javassist:javassist:3.25.0-GA' }
    

5
投票
对我来说,

build.gradle中的这两行对我有用。

compile group: 'javax.xml.bind', name: 'jaxb-api', version: '2.3.1' compile group: 'org.glassfish.jaxb', name: 'jaxb-runtime', version: '2.3.1'
    

4
投票
我也在为同样的问题而苦苦挣扎。

jakarta.xml.bind 实现需要使用 com.sun.xml.bind.v2.ContextFactory 而不是 中可用的 com.sun.xml.internal.bind.v2.ContextFactory com.sun.xml.bind。所以这个组合对我有用。


1
投票
在我的 pom 中添加这些依赖项解决了问题

<dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-core</artifactId> <version>2.3.0.1</version> </dependency> <dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.3.1</version> </dependency> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-impl</artifactId> <version>2.3.1</version> </dependency>
    

0
投票
我必须在我的项目中创建并添加以下文件


META-INF/services/javax.xml.bind.JAXBContext

,内容如下:

com.sun.xml.bind.v2.ContextFactory

这告诉 API 使用哪个实现。

我正在使用以下运行时实现:

<!-- https://mvnrepository.com/artifact/org.glassfish.jaxb/jaxb-runtime --> <dependency> <groupId>org.glassfish.jaxb</groupId> <artifactId>jaxb-runtime</artifactId> <version>2.3.1</version> </dependency>
    
© www.soinside.com 2019 - 2024. All rights reserved.