Ich versuche JAXB 2.2.11 in einer OSgi-Umgebung (Liferay DXP) zu verwenden. Ich habe Probleme beim Erstellen eines JAXBContext. Basierend auf einigen anderen Quellen, die ich während meiner Recherchen wie this und this gefunden habe, habe ich festgestellt, dass ich in einem osgi Container den richtigen Classloader für JAXB bereitstellen muss, um den Kontext zu instanziieren. Also ich habe Code wie folgt:Wie JAXB 2.2.11 in OSgi (Liferay DXP)
ClassLoader cl package.with.jaxb.objects.ObjectFactory.class.getClassLoader(); JAXBContext jc = JAXBContext.newInstance("package.with.jaxb.objects ", cl);
Dieser Code verursacht eine Null-Zeiger-Ausnahme mit dem folgenden Stack-Trace:
Caused by: java.lang.NullPointerException
at javax.xml.bind.ContextFinder.handleClassCastException(ContextFinder.java:129)
at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:201)
at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:146)
at javax.xml.bind.ContextFinder.find(ContextFinder.java:371)
at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:446)
at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:409)
an der Quelle der Suche nach ContextFinder kann ich sehen, dass context
null sein müssen on line 129:
throw handleClassCastException(context.getClass(), JAXBContext.class);
ich dachte perhap s Das Problem war, dass mein Modul eine Abhängigkeit von jaxb-api 2.2.11 hat, aber die jaxb-impl Klassen zur Laufzeit von rt.jar bereitgestellt werden und wahrscheinlich neuer als 2.2.11 sind, da Liferay DXP auf JDK 1.8 läuft. Um dieses Problem zu umgehen, habe ich versucht, jaxb-impl.jar 2.2.11 als eine Abhängigkeit in meinem osgi-Modul, denken dann die jaxb-api & jaxb-impl-Versionen würden übereinstimmen. Danach wird versucht, einen JAXBContent mit dem gleichen Code wie oben ergibt folgende Fehler zu erstellen:
ClassCastException: attempting to cast jar:file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/rt.jar!/javax/xml/bind/JAXBContext.class to bundleresource://623.fwk616113009:13/javax/xml/bind/JAXBContext.class. Please make sure that you are specifying the proper ClassLoader.
Durch das Aussehen dieser Nachricht, die JAXBContext, das ist von der Version von JAXBContext instanziiert zu werden, die über geladen wird rt.jar. Das ist sehr verwirrend für mich, da ich erwarten würde, dass die JAXBContext-Version, die vom Classloader meines Moduls geladen wurde, verwendet wird, da ich jaxb-impl.jar in mein Modul eingefügt habe und angegeben habe, dass der Klassenlader meines Moduls derjenige ist, der verwendet wird mein Aufruf an JAXBContext.newInstance. Kann jemand etwas Licht darauf werfen, wie ich jaxb 2.2.11 in einem osgi Container arbeiten kann?
* Bitte beachten Sie, dass ich die von meinem Modul verwendete Version von jaxb-api nicht aktualisieren kann, da der JAXB-Code tatsächlich in einem 3rd-Party-Jar ist, der jaxb 2.2.11 benötigt (ich habe gerade das 3rd-Party-Jar aus dem Programm genommen) die Gleichung für jetzt, indem Sie einen Test-JAXB-Code schreiben).
Vielen Dank für die Antwort Grzegorz. Leider habe ich, wie ich am Ende meines Posts erwähnt habe, nicht wirklich die Kontrolle darüber, wie der JAXB-Code geschrieben wurde, weil er in einer 3rd-Party-Bibliothek namens STIX (https://github.com/STIXProject/java -stix) und die STIX-Lib benutzt jaxb-api. – clav