2009-07-02 2 views
0

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?

Antwort

1

Die Umsetzung in der „com.sun.org.apache ...“ -Paket ist die Xerces, die als Teil der JRE verpackt ist. Der erste, der "org.apache ..." startet, ist die eigenständige Distribution von Apache. Sie können in der gleichen Anwendung zusammen ausgeführt werden, aber es kann ziemlich verwirrend werden.

Das Projekt Ihres Clients enthält anscheinend eine Kopie der eigenständigen Apache-Verteilung (wahrscheinlich xercesImpl.jar). Bitten Sie sie, rem, ove es und sehen Sie, ob es anfängt, den eingebauten JRE-Code zu verwenden.

+0

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

+0

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

0

Wahrscheinlich haben Sie nicht xercesImpl.jar im Classpath des Kunden Projekt