I am getting the error below while running my eclipse plugin. Eclipse used 4.12 with java11. It used to work fine in 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 (InvocationEvent.java:313)
at (EventQueue.java:770)
at (EventQueue.java:721)
at (EventQueue.java:715)
at (Native Method)
at (ProtectionDomain.java:85)
at (EventQueue.java:740)
at (EventDispatchThread.java:203)
at (EventDispatchThread.java:124)
at (EventDispatchThread.java:113)
at (EventDispatchThread.java:109)
at (EventDispatchThread.java:101)
at (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 (ClassLoader.java:521)
at javax.xml.bind.ContextFinder.safeLoadClass(ContextFinder.java:480)
at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:112)
8 Answers
Sun people have remove directly access to jaxb package in java 11.
These dependency will work instead of it. Same fix 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>
I've stumbled upon this question while migrating a big ancient Java application to Java 11. I think the following might come useful.
I had everything in place in my Maven POMs, javax bindings, JAXB's implementation, a few tests working fine. Yet, the original application's tests kept inexplicably complaining that com.sun.xml.internal.bind.v2.ContextFactory is not found.
Indeed, that class isn't in any 3rd-party implementations of JAXB (I'm using the Glassfish's one, but there are several others), and one has to replace the default factory that is instantiated inside javax.xml.bind.JAXBContext.newInstance( <classes> ) with some new implementation (com.sun.xml.bind.v2.JAXBContextFactory in my case and, I guess, in other JAXB libs too).
And well, one of the ways to set that is via the jaxb.properties file, which must be visible to the classpath (so, in Maven, it's usually somewhere like src/main/resources/*). As it is explained here, this file has to contain:
javax.xml.bind.context.factory=com.sun.xml.bind.v2.JAXBContextFactory
In my case, it was containing the old now-disappeared factory. I guess, current JAXB libraries use a correct default factory if they don't meet that file, however it might be already present in your codebase and you might need a while before realising it. I hope that this answer will save you the time I wasted.
Yes, you are using features in javax that existed in java 8 but are removed in Java 11
see this answer How to resolve java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException in Java 9
These libs worked for me (inspired by Vivek's response above). When I tried using JAXB sample from Vogella tutorial with 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'
}
For me, these 2 lines in the build.gradle worked for me.
compile group: 'javax.xml.bind', name: 'jaxb-api', version: '2.3.1'
compile group: 'org.glassfish.jaxb', name: 'jaxb-runtime', version: '2.3.1'
I was strugling with the same problem. The jakarta.xml.bind implementation will want to use the com.sun.xml.bind.v2.ContextFactory instead of com.sun.xml.internal.bind.v2.ContextFactory which is available in the com.sun.xml.bind. So that combo worked for me.
I had to create and add the following file in my project
META-INF/services/javax.xml.bind.JAXBContext
with the following content:
com.sun.xml.bind.v2.ContextFactory
This tells the API which implementation to use.
I was using the following runtime implementation:
<!-- -->
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.1</version>
</dependency>
Adding these dependancies in my pom solved the 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>