36

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 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)
flavio.donze
  • 7,432
  • 9
  • 58
  • 91
Java dev
  • 437
  • 1
  • 4
  • 12
  • A plug-in that you have installed into Eclipse (`com.my.cep.studio`?) makes use of JAXB, which is contained in Java 8, but not in Java 11. [Running Eclipse with Java 8](https://wiki.eclipse.org/Eclipse.ini#Specifying_the_JVM) should fix your issue (you can still use Java 11 for your projects in Eclipse). – howlger Sep 19 '19 at 15:13
  • @howler com.my.cep.studio is my custom writen plugin. The exception occurs from eclipse internal plugin "javax.xml.bind_2.2.0.v201105210648.jar". This is same as jaxb jar and same code inside. The exception occurs from class ContextFinder find method at line return newInstance(contextPath, contextPathClasses, PLATFORM_DEFAULT_FACTORY_CLASS, classLoader, properties). Here PLATFORM_DEFAULT_FACTORY_CLASS points to com.sun.xml.internal.bind.v2.ContextFactory – Java dev Sep 20 '19 at 06:00
  • The Eclipse platform does not require or contain the JAXB plug-in (only some Eclipse IDE packages contain the `javax.xml.bind` plug-in). Probably a plug-in/bundle is missing in your dependencies. Show how `javax.xml.bind.ContextFinder` is included, and find out which missing plug-in contains `com.sun.xml.internal.bind.v2.ContextFactory`. – howlger Sep 20 '19 at 07:12
  • All you need to go through this answer https://stackoverflow.com/questions/48204141/replacements-for-deprecated-jpms-modules-with-java-ee-apis/48204154#48204154 – Ram Apr 15 '21 at 11:47

8 Answers8

63

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>
DuDa
  • 3,718
  • 4
  • 16
  • 36
11

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.

zakmck
  • 2,715
  • 1
  • 37
  • 53
10

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

Yann TM
  • 1,942
  • 13
  • 22
4

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'
}
Diego
  • 1,678
  • 1
  • 16
  • 20
4

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'
Manan Shah
  • 1,042
  • 2
  • 14
  • 26
3

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.

0

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

enter image description here

This tells the API which implementation to use.

I was using the following runtime implementation:

<!-- 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>
flavio.donze
  • 7,432
  • 9
  • 58
  • 91
0

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>