J'obtiens une erreur ci-dessous lors de l'exécution de mon plugin eclipse. Eclipse a utilisé 4.12 avec java11. Cela 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)
5 Réponses :
Oui, vous utilisez des fonctionnalités de javax qui existaient dans java 8 mais qui sont supprimées dans Java 11
voir cette réponse Comment résoudre java.lang.NoClassDefFoundError: javax / xml / bind / JAXBException dans Java 9
Je comprends cela, mais c'est différent de mon cas. Voir mon commentaire ci-dessus.
Je suis tombé sur cette question lors de la migration d'une grande application Java ancienne vers Java 11. Je pense que ce qui suit pourrait être utile.
J'avais tout en place dans mes POM Maven, les liaisons javax, l'implémentation de JAXB, quelques tests fonctionnant bien. Pourtant, les tests de l'application d'origine continuaient de se plaindre inexplicablement que com.sun.xml.internal.bind.v2.ContextFactory
est introuvable.
En effet, cette classe ne figure dans aucune implémentation tierce de JAXB (j'utilise celle de Glassfish, mais il y en a plusieurs autres), et il faut remplacer l'usine 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'un des moyens de définir cela est via le fichier jaxb.properties
, qui doit être visible dans le jaxb.properties
(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 correspondent pas à ce fichier, mais il peut être déjà 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 fera gagner le temps que j'ai perdu.
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>
Pour Intellij, j'ai inclus la même chose comme ceci:
Ces bibliothèques ont fonctionné pour moi (inspirées par la réponse de Vivek ci-dessus). Quand j'ai essayé d'utiliser l' exemple JAXB du didacticiel Vogella avec 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' }
J'étais aux prises avec le même problème. L'implémentation jakarta.xml.bind voudra utiliser le com.sun.xml.bind.v2.ContextFactory au lieu de com.sun.xml.internal.bind.v2.ContextFactory qui est disponible dans le com.sun.xml.bind . Donc, ce combo a fonctionné pour moi.
Un plug-in que vous avez installé dans Eclipse (
com.my.cep.studio
?)com.my.cep.studio
JAXB, qui est contenu dans Java 8, mais pas dans Java 11. L' exécution d'Eclipse avec Java 8 devrait résoudre votre problème (vous pouvez utilisez toujours Java 11 pour vos projets dans Eclipse).@howler com.my.cep.studio est mon plugin d'écriture personnalisé. L'exception se produit à partir du plugin interne eclipse "javax.xml.bind_2.2.0.v201105210648.jar". C'est la même chose que jaxb jar et le même code à l'intérieur. L'exception se produit à partir de la méthode de recherche de la classe ContextFinder à la ligne return newInstance (contextPath, contextPathClasses, PLATFORM_DEFAULT_FACTORY_CLASS, classLoader, propriétés). Ici, PLATFORM_DEFAULT_FACTORY_CLASS pointe vers com.sun.xml.internal.bind.v2.ContextFactory
La plate-forme Eclipse ne nécessite ni ne contient le plug-in JAXB (seuls certains packages Eclipse IDE contiennent le plug-in
javax.xml.bind
). Il manque probablement un plug-in / bundle dans vos dépendances. Montrez commentjavax.xml.bind.ContextFinder
est inclus et découvrez quel plug-in manquant contientcom.sun.xml.internal.bind.v2.ContextFactory
.