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)
Sun people have remove directly access to jaxb package in Java 11.
These dependency will work instead of it.
And same time if if you are facing hibernate "NullPointerException" issue.
<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>
大きな古代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ライブラリもそうだと思います)。
そして、それを設定する方法の1つは、クラスパスから可視である必要がある_jaxb.properties
_ファイルを使用する方法です(したがって、Mavenでは、通常_src/main/resources/*
_のような場所にあります)。説明されているように、 ここ 、このファイルには以下が含まれている必要があります:
_javax.xml.bind.context.factory=com.Sun.xml.bind.v2.JAXBContextFactory
_
私の場合、そこには古い消えた工場が含まれていました。おそらく、現在のJAXBライブラリは、そのファイルに適合しない場合は正しいデフォルトファクトリを使用しますが、コードベースにすでに存在していて、実現するまでにしばらく時間がかかる場合があります。この答えが、私が必要としている時間よりも少ない時間で済むようになることを願っています。