Ich habe ein Stück Code, der gut isoliert funktioniert, aber eine Abhängigkeit in einem Client-Projekt fehlgeschlagen. Ein Anruf anWie debuggen Java dependendency Fehler auf Version von DOMImplementation
Dokument doc = impl.createDocument (null, null, null);
schlägt fehl (sieht aus wie das Problem bei http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4913257). Die Instanz von 'impl' in meinen Komponententests ist eine Instanz von com.sun.org.apache.xerces.internal.dom.DOMImplementationImpl. In meinem Client-Code ist dies eine Instanz von org.apache.xerces.dom.DOMImplementationImpl.
Wie kann ich diese Abhängigkeit zurückverfolgen? Ich habe versucht, alle Klassen und JAR-Dateien im Klassenpfad manuell durchlaufen, aber den Anbieter von org.apache.xerces.dom.DOMImplementation nicht finden. Ist es möglich zu beobachten, wann Klassen geladen werden (und warum)? Wie wird die bestimmte DOM-Implementierung ausgewählt? Kann ich jetzt den jvm zwingen, eine bestimmte Implementierung zu verwenden?
Das macht Sinn. Nun stellt sich die Frage, in welches Glas die Apache-Verteilung gehört. Es gibt kein xercesImpl im Klassenpfad, und ich kann nicht finden, welches jar die org.apache.xerces. * -Klassen hat. Ausführen mit -Djaxp.debug = true druckt JAXP: gefunden jar resource = META-INF/services/javax.xml.parsers.DocumentBuilderFactory mit ClassLoader: [email protected] aber es ist leider nicht sagen welches Glas. – eaubin
Dort muss sich eine JAR befinden, die einen Eintrag META-INF/services/javax.xml.parsers.DocumentBuilderFactory enthält. Denken Sie daran, auch in der JRE-Installation des Clients nachzuschauen, da sie Xerces möglicherweise dort abgelegt haben. – skaffman