Wie finde ich heraus, welche JAXP-Implementierung verwendet wird und woher sie geladen wurde?
Möchte ich Diagnose-Informationen über das, was JAXP-Implementierung verwendet wird, und die JAR-Datei geladen wurde.
Ein Weg dies zu erreichen ist, erstellen Sie eine Instanz von, zum Beispiel, eine DocumentBuilderFactory
und überprüfen Sie dann die Eigenschaften der Klasse:
private static String GetJaxpImplementation() {
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
Class<? extends DocumentBuilderFactory> c = documentBuilderFactory.getClass();
Package p = c.getPackage();
CodeSource source = c.getProtectionDomain().getCodeSource();
return MessageFormat.format(
"Using JAXP implementation ''{0}'' ({1}) version {2} ({3}){4}",
p.getName(),
p.getImplementationVendor(),
p.getSpecificationVersion(),
p.getImplementationVersion(),
source == null ? "." : " loaded from: " + source.getLocation());
}
Gibt es einen besseren Weg, um dies zu erreichen, vielleicht auch ohne das erstellen einer DocumentBuilderFactory
?
InformationsquelleAutor der Frage Daniel Fortunov | 2009-11-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist es ganz schwer vorherzusagen, welche konkreten JAXP factory-Implementierung geladen werden, ohne tatsächlich die Schaffung einer Instanz, da das Verfahren zur Auswahl einer Umsetzung.
Aus der Offizielle JAXP FAQ (Frage 14):
Zusätzlich zu dieser Komplexität, die jeden einzelnen JAXP factory ist eine unabhängige Implementierung angegeben. Es ist üblich, verwenden Sie eine parser-Implementierung und eine andere XSLT-Implementierung, die Granularität der Auswahl-Mechanismus oben können Sie mix and match zu einem noch höheren Grad.
Der folgende code liefert Informationen über die vier wichtigsten JAXP Fabriken:
Die folgende Beispielausgabe zeigt einen mix-and-match von drei verschiedenen Implementierungen von JAXP (Built-in Xerces und externe JARs für Xerces 2.8 und Xalan) arbeiten zusammen:
InformationsquelleAutor der Antwort Daniel Fortunov
Fügen Sie einfach
zu
JAVA_OPTS
und Sie werden sehen, wie Informationen.Weitere Details: https://docs.oracle.com/javase/7/docs/api/javax/xml/parsers/DocumentBuilderFactory.html
InformationsquelleAutor der Antwort trang
es ist einfach, man muss nur
der track wird Ihnen sagen, whick impl und komfortablen Weg, jaxp benutzen.
InformationsquelleAutor der Antwort zg_spring
Kommt drauf an, aber generell Nein.
DocumentBuilderFactory.newInstance()
wird, kehren Sie entweder die Umsetzung vonDocumentBuilderFactory
die konfiguriert ist, die in der system property "javax.xml.Parser.DocumentBuilderFactory" oder der JRE Standard-Werk wenn die system-Eigenschaft ist nicht festgelegt. Die Werkseinstellung ist wahrscheinlich hart codiert in der Umsetzung der newInstance-Methode und die andernfalls nicht zugänglich sind.Wenn die system-Eigenschaft festgelegt ist, könnten Sie zumindest die getResource-Methode für den jeweiligen class loader, um die URL, von der die class-loader geladen, die entsprechende class-Datei. Wenn es aus einer jar-Datei, sollten Sie in der Lage, extrahieren Sie die Datei-Namen (oder Quell-URL) aus dem Glas: - URL. Detaillierte Informationen zum Paket sollte auch verfügbar sein, wenn Sie manaully Lesen der meta-Daten-Dateien aus dem Klassenpfad.
Wenn das system die Eigenschaft nicht gesetzt, ich bin mir ziemlich sicher, dass Sie keine Möglichkeit haben, die Informationen, die Sie suchen, ohne tatsächlich die Schaffung einer neuen Fabrik, als Sie bereits tut.
InformationsquelleAutor der Antwort jarnbjo
Gibt es einen anderen Speicherort, der durchsucht wird, bevor die "fallback-Plattform Standard-Implementierung" und das ist die
java.endorsed.dirs
Verzeichnis dokumentiert, wie in der Java Endorsed Standards Override MechanismInformationsquelleAutor der Antwort jwd630