I would like to provide diagnostic information about what JAXP implementation is in use, and which JAR file it was loaded from.
One way to achieve this is to create in instance of, for example, a DocumentBuilderFactory
, and then inspect the properties of that class:
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());
}
Is there a better way to achieve this, perhaps without having to create a DocumentBuilderFactory
?
It is quite difficult to predict what concrete JAXP factory implementation will be loaded without actually creating an instance because the process for selecting an implementation.
From the Official JAXP FAQ (Question 14):
Adding to this complexity, each individual JAXP factory can have an independent implementation specified. It is common to use one parser implementation and another XSLT implementation, but the granularity of the selection mechanism above allows you to mix and match to an even greater degree.
The following code will output information about the four main JAXP factories:
The following sample output illustrates a mix-and-match of three different JAXP implementations (Built-in Xerces and external JARs for Xerces 2.8 and Xalan) working together:
Just add
to
JAVA_OPTS
and you will see such information.For more detail: https://docs.oracle.com/javase/7/docs/api/javax/xml/parsers/DocumentBuilderFactory.html
it is easy, you just set
the track will tell you whick impl,and whick way jaxp use.
It depends, but generally no.
DocumentBuilderFactory.newInstance()
will either return the implementation ofDocumentBuilderFactory
which is configured in the system property "javax.xml.parsers.DocumentBuilderFactory" or the JRE's default factory if the system property is not set. The default factory is most likely hard coded in the implementation of the newInstance method and not otherwise accessible.If the system property is set, you could at least use the getResource method on the relevant class loader to get the URL, from which the class loader would load the corresponding class file. If it is from a jar file, you should be able to extract the file name (or source URL) from the jar: URL. Detailed package information should also be available if you manaully read the meta data files from the classpath.
If the system property is not set, I'm pretty sure that you have no way to get the information you are looking for without actually creating a new factory as you're already doing.
There is another location that is searched before the "fallback platform default implementation" and that is the
java.endorsed.dirs
directory as documented in the Java Endorsed Standards Override Mechanism