【问题标题】:Eclipse 4.12 - java.lang.ClassNotFoundException: com.sun.xml.internal.bind.v2.ContextFactoryEclipse 4.12 - java.lang.ClassNotFoundException: com.sun.xml.internal.bind.v2.ContextFactory
【发布时间】:2020-01-20 08:55:02
【问题描述】:

运行 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)

【问题讨论】:

  • 您安装到 Eclipse (com.my.cep.studio?) 中的插件使用了 Java 8 中包含的 JAXB,但 Java 11 中没有。Running Eclipse with Java 8 应该可以解决您的问题 (您仍然可以在 Eclipse 中为您的项目使用 Java 11)。
  • @howler com.my.cep.studio 是我的自定义 writen 插件。 eclipse内部插件“javax.xml.bind_2.2.0.v201105210648.jar”发生异常。这与 jaxb jar 和内部代码相同。异常发生在类 ContextFinder 查找方法的行 return newInstance(contextPath, contextPathClasses, PLATFORM_DEFAULT_FACTORY_CLASS, classLoader, properties)。这里 PLATFORM_DEFAULT_FACTORY_CLASS 指向 com.sun.xml.internal.bind.v2.ContextFactory
  • Eclipse 平台不需要也不包含 JAXB 插件(只有部分 Eclipse IDE 包包含javax.xml.bind 插件)。您的依赖项中可能缺少插件/捆绑包。显示如何包含javax.xml.bind.ContextFinder,并找出包含com.sun.xml.internal.bind.v2.ContextFactory 的缺失插件。
  • 所有你需要通过这个答案stackoverflow.com/questions/48204141/…

标签: eclipse eclipse-plugin eclipse-rcp java-11


【解决方案1】:

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>

【讨论】:

    【解决方案2】:

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

    看到这个答案 How to resolve java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException in Java 9

    【讨论】:

      【解决方案3】:

      我在将 big ancient Java application 迁移到 Java 11 时偶然发现了这个问题。我认为以下内容可能会有用。

      我的 Maven POM、javax 绑定、JAXB 的实现以及一些运行良好的测试都已准备就绪。然而,原始应用程序的测试一直莫名其妙地抱怨找不到com.sun.xml.internal.bind.v2.ContextFactory

      确实,该类不在 JAXB 的任何第 3 方实现中(我使用的是 Glassfish 的,但还有其他几个),并且必须将在 javax.xml.bind.JAXBContext.newInstance( &lt;classes&gt; ) 中实例化的默认工厂替换为一些新的实现(在我的例子中是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 库不符合该文件,它们会使用正确的默认工厂,但是它可能已经存在于您的代码库中,您可能需要一段时间才能意识到它。我希望这个答案可以为您节省我浪费的时间。

      【讨论】:

        【解决方案4】:

        这些库对我有用(受上述 Vivek 回复的启发)。当我尝试将JAXB sample from Vogella tutorial 与 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】:

          我也在为同样的问题而苦苦挣扎。 jakarta.xml.bind 实现需要使用 com.sun.xml.bind.v2.ContextFactory 而不是 com.sun.xml.internal。 com.sun.xml.bind 中提供的 bind.v2.ContextFactory。所以这个组合对我有用。

          【讨论】:

            【解决方案6】:

            对我来说,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'
            

            【讨论】:

              【解决方案7】:

              我也在努力解决同样的问题。将休眠版本从 4.3.5.Final 更改为 5.4.32.Final 对我有用。

              【讨论】:

                猜你喜欢
                • 2021-06-13
                • 2010-11-06
                • 1970-01-01
                • 2022-01-23
                • 2013-07-03
                • 2012-03-30
                • 2014-01-18
                相关资源
                最近更新 更多