8
votes

Eclipse 4.12 - java.lang.ClassNotFoundException: com.sun.xml.internal.bind.v2.ContextFactory

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)


3 commentaires

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 comment javax.xml.bind.ContextFinder est inclus et découvrez quel plug-in manquant contient com.sun.xml.internal.bind.v2.ContextFactory .


5 Réponses :


7
votes

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


1 commentaires

Je comprends cela, mais c'est différent de mon cas. Voir mon commentaire ci-dessus.



3
votes

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.


0 commentaires

14
votes
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>

1 commentaires

Pour Intellij, j'ai inclus la même chose comme ceci:



0
votes

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'
}


0 commentaires

0
votes

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.


0 commentaires