我在运行我的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)
7条答案
按热度按时间xmjla07d1#
Sun的人已经在java11中删除了对jaxb包的直接访问。
这些依赖项将代替它工作。如果你面临hib
NullPointerException
问题,同样的修复。inkz8wg92#
我在将big ancient Java application迁移到Java11时偶然发现了这个问题。我认为以下内容可能会很有用。
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/*
之类的位置)。在我的例子中,它包含了现在已经消失的旧工厂。我猜,当前的JAXB库在不满足该文件时会使用正确的默认工厂,但是它可能已经存在于您的代码库中,您可能需要一段时间才能意识到它。我希望这个答案能保存您我浪费的时间。
ctehm74n3#
是的,您使用的是javax中存在于java 8中但在Java 11中删除的功能
请参阅此答案How to resolve java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException in Java 9
hwamh0ep4#
当我尝试使用JAXB sample from Vogella tutorial和Intellij时,这些库对我很有效(灵感来自上面Vivek的回应)。
lvjbypge5#
我也在为同样的问题而挣扎。jakarta.xml.bind实现将希望使用com.sun.xml.bind.v2.ContextFactory而不是com.sun.xml.internal.bind.v2.ContextFactory,后者在com.sun.xml.bind中可用。所以那个组合对我很有效。
vhmi4jdf6#
对我来说,build.gradle中的这两行代码很适合我。
ar7v8xwq7#
我必须在项目中创建并添加以下文件
META-INF/services/javax.xml.bind.JAXBContext
其内容如下:
这将告诉API使用哪个实现。
我使用了以下运行时实现: