Legen Sie die JAXB-context-factory Initialisierung der Klasse verwendet werden

Ich haben aktualisiert unsere Projekte (Java EE basiert die Ausführung auf Websphere 8.5) Verwendung einer neuen Version eines Unternehmens, die internen Rahmenbedingungen (und Ejb 3.x deployment-Deskriptoren eher als die 2.x sind). Seitdem meine integration Tests fehlschlägt, mit der folgenden Ausnahme:

 [java.lang.ClassNotFoundException: com.ibm.xml.xlxp2.jaxb.JAXBContextFactory]

Ich die Anwendung erstellen können mit dem bisherigen framework release und alles funktioniert einwandfrei.
Während der Fehlersuche habe ich bemerkt, dass innerhalb der ContextFinder (javax.xml.binden) gibt es zwei unterschiedliche Verhaltensweisen:

  1. Vorherigen Version (Alles in Ordnung): Keine von den verschiedenen Orten, die bis bringt eine factory-Klasse, so dass die Standard-factory-Klasse geladen wird, die com.Sonne.xml.intern.binden.v2.ContextFactory (definiert als String-Konstanten innerhalb der Klasse).

  2. Aktualisierte Version (ClassNotFound): Es ist eine Ressource "META-INF/services/javax.xml.binden.JAXBContext" beeing erfolgreich geladen und die erste Zeile Lesen macht die ContextFinder Versuch, zu laden ", Kom.ibm.xml.xlxp2.jaxb.JAXBContextFactory" die den Fehler verursacht.

Ich habe jetzt zwei Fragen:

  1. Was ist eine Ressource? Da in unserem OHR gibt es zwei Kriege, und keiner der beiden enthält ein Ordner-Dienste in Ihrem
    META-INF-Verzeichnis.

  2. Wo könnte das Wert sein, anders? Weil ein filediff zeigte mir keine neuen oder geänderten properties-Dateien.

Keine Notwendigkeit zu sagen, ich werde Lesen Sie alles über die JAXB-Konfigurations-Möglichkeiten, aber wenn Sie haben, erste Einblicke auf das, was hätte schiefgehen können, oder helfen Sie mir mit, dass die Ressource (es ist eine echte Datei muss ich suchen?) id schätzen wissen eine Menge. Vielen Dank!

BEARBEITEN (laut Kommentaren Input/Fragen):

Aus Neugier, hat Ihr framework enthalten JAXB Gläser? Habe die alte version von Ihrem Rahmen enthalten jaxb.Eigenschaften?

In der Tat (ich bin ein bisschen überrascht) das framework eine angepasste eclipselink-2.4.1-.jar im inneren des OHRES, die eine JAXB-Implementierung und jaxb.Eigenschaften-Datei, zeigt der folgende Eintrag in beiden Versionen (die eine findet sich in der Fabrik ebenso wie in der einen wirft die Ausnahme):

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

Ich denke, das hat nichts zu tun mit der aktuellen Ausgabe, da das Glas blieb genau die gleiche in beiden Ohren (die, die läuft/die eine mit der Erwartung)

Es ist auch mir nicht klar, warum die alte version der Rahmen war immer die Auswahl der com.sun-Implementierung

Gibt es die Klasse javax.xml.binden.ContextFinder die verantwortlich ist für die Initialisierung des JAXBContextFactory. Diese Klasse sucht verschiedene placess für die Existenz einer jaxb.Eigenschaften-Datei oder eine "javax.xml.binden.JAXBContext" Ressource. Wenn ALLE diese Orte nicht, die Kontext Fabrik gibt es eine deault Fabrik geladen, die ist hardcoded in der Klasse selbst:

private static final String PLATFORM_DEFAULT_FACTORY_CLASS = "com.sun.xml.internal.bind.v2.ContextFactory";

Nun zurück zu meinem problem:

Gebäude mit der früheren version des Frameworks (und EJB-2.x deployment Deskriptoren) funktioniert alles einwandfrei). Beim Debuggen kann ich sehen, dass es ist keine Konfiguration gefunden, und thatfore oben erwähnt die Werkseinstellung ist geladen.

Gebäude mit der neuen version des Frameworks (und EJB 3.x deployment-Deskriptoren, so kann ich bereitstellen) NUR EIN TESTFALL fehlschlägt, aber der rest der Funktionen funktioniert (wie kann ich senden Sie Anfragen an unseren webservice und Sie nicht auslösen, Fehler). Beim Debuggen kann ich sehen, dass es eine Konfiguration gefunden. Diese Ressource namens "META-INF/services/javax.xml.binden.JAXBContext". Hier sind die wichtigsten Linien, wie diese Ressource führt zu dem Versuch, zu laden", Kom.ibm.xml.xlxp2.jaxb.JAXBContextFactory' das wirft dann die ClassNotFoundException. Dies ist, vereinfacht Quelle der genannten javax.xml.binden.ContextFinder Klasse:

URL resourceURL = ClassLoader.getSystemResource("META-INF/services/javax.xml.bind.JAXBContext");

BufferedReader r = new BufferedReader(new InputStreamReader(resourceURL.openStream(), "UTF-8"));

String factoryClassName = r.readLine().trim();  

Bereich factoryClassName hat jetzt den Wert " com.ibm.xml.xlxp2.jaxb.JAXBContextFactory'

Weil dies hat sich zu einem super lager Frage werde ich auch hinzufügen, ein Kopfgeld 🙂
Ich werde daran arbeiten, den ganzen Tag über dies und lassen Sie wissen, ob es irgendwelche Nachrichten.

Update/Lösung

Diese Frage gelöst wurde. Das ursprüngliche problem ist aufgetreten, weil Fehlkonfiguration Komplex bauen multi-Modell maven-Projekte, die eine Abhängigkeit verwendet eine aktualisierte version eine angepasste eclipse-link-Glas, die eine definition für ein JAXBFactory nicht in der Komponente, wo der Fehler aufgetreten ist. Einstellung der JAXB-context-factory in den meisten Fällen so konfiguriert ist, mit einer jaxb.propertie-Datei oder JAXBContext-Datei, die enthält die gleiche definition. Detaillierte Beladung der entsprechenden JAXBContextFactory passiert in javax.xml.binden.ContextFinder.

Der Fehler wurde noch nicht behoben (während der Tat über 4 große EE/SE-Anwendungen führen zu dem Fehler) und es gibt keine Allgemeine Antwort, aber das definiert JAXBContextFactorys muss vorhanden sein, in Ihren Klassenpfad ein (wow, was für ein Wunder...), so haben Sie entweder eine, die ClassNotFound Fehler, da Sie auf fehlende Ressourcen (auch das ist das acctual Ursache), oder weil Sie einen falschen JAXBContextFactory definiert in einem der oben genannten propertie-Dateien, die enthalten eine definition entsprechend der unten stehenden Antwort.

Sehr vielen Dank für deine tollen Kommentare und die Unterstützung, die ich wirklich zu schätzen!

  • Sehr vielen Dank für die Bearbeitung!
  • Aus Neugier, hat Ihr framework enthalten JAXB Gläser? Habe die alte version von Ihrem Rahmen enthalten jaxb.Eigenschaften? Es ist mir nicht klar, wie Sie endete in einer situation, wo Sie Ihren application class loader können finden Sie in der META-INF/services-Datei, nicht aber die Umsetzung-Klasse. Es ist auch mir nicht klar, warum die alte version der Rahmen war immer die Auswahl der com.sun-Implementierung.
  • Vielen Dank für euren input, ich editet die Fragen, die hoffentlich mehr Informationen
  • Nochmals sehr vielen Dank für die Bearbeitung! Ich verspreche, bevor ich nach der nächsten Frage werde ich stellen Sie sicher, alles zu verstehen, wie format approperly!
  • stackoverflow.com/questions/48832270/...
Schreibe einen Kommentar