Je reçois une erreur inférieure lors de l'exécution de mon plug-in Eclipse. Eclipse a utilisé 4.12 avec Java11. Il fonctionnait bien dans 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>
Je suis tombé sur cette question lors de la migration d'un grand ancien Java vers Java 11. Je pense que les éléments suivants pourraient être utiles) .
J'avais tout en place dans mes POMs Maven, les liaisons javax, l'implémentation de JAXB, quelques tests qui fonctionnaient bien. Pourtant, les tests de l'application d'origine se plaignaient inexplicablement que com.Sun.xml.internal.bind.v2.ContextFactory
N'était pas trouvé.
En effet, cette classe n'est dans aucune implémentation tierce de JAXB (j'utilise celle de Glassfish, mais il y en a plusieurs autres), et il faut remplacer la fabrique par défaut qui est instanciée dans javax.xml.bind.JAXBContext.newInstance( <classes> )
avec une nouvelle implémentation (com.Sun.xml.bind.v2.JAXBContextFactory
dans mon cas et, je suppose, dans d'autres bibliothèques JAXB aussi).
Et bien, l'une des façons de définir cela est via le fichier jaxb.properties
, Qui doit être visible par le chemin de classe (donc, dans Maven, c'est généralement quelque part comme src/main/resources/*
). Comme il est expliqué ici , ce fichier doit contenir:
javax.xml.bind.context.factory=com.Sun.xml.bind.v2.JAXBContextFactory
Dans mon cas, il contenait l'ancienne usine aujourd'hui disparue. Je suppose que les bibliothèques JAXB actuelles utilisent une usine par défaut correcte si elles ne répondent pas à ce fichier, mais il pourrait déjà être présent dans votre base de code et vous pourriez avoir besoin d'un certain temps avant de le réaliser. J'espère que cette réponse vous aidera à prendre moins de temps pour cela que ce dont j'avais besoin.