実装を選択するプロセスのため、実際にインスタンスを作成せずに、どの具体的なJAXPファクトリ実装がロードされるかを予測することは非常に困難です。
公式JAXPFAQ(質問14)から:
アプリケーションが新しいJAXPDocumentBuilderFactory
インスタンスを作成する場合、staicメソッドを呼び出します
DocumentBuilderFactory.newInstance()
。DocumentBuilderFactory
これにより、次の順序を使用して具体的なサブクラスの名前が検索され
ます。
javax.xml.parsers.DocumentBuilderFactory
システムプロパティが存在し、アクセス可能であるかどうかなどのシステムプロパティの値。
- ファイル
$JAVA_HOME/jre/lib/jaxp.properties
が存在する場合はその内容。
- Jarファイル仕様で指定されているJarサービスプロバイダーの検出メカニズム。jarファイルには
META-INF/services/javax.xml.parsers.DocumentBuilderFactory
、インスタンス化する具象クラスの名前などのリソース(つまり、埋め込みファイル)を含めることができます。
- フォールバックプラットフォームのデフォルトの実装。
この複雑さに加えて、個々のJAXPファクトリは独立した実装を指定できます。1つのパーサー実装と別のXSLT実装を使用するのが一般的ですが、上記の選択メカニズムの粒度により、さらに高度に混合および一致させることができます。
次のコードは、4つの主要なJAXPファクトリに関する情報を出力します。
private static void OutputJaxpImplementationInfo() {
System.out.println(getJaxpImplementationInfo("DocumentBuilderFactory", DocumentBuilderFactory.newInstance().getClass()));
System.out.println(getJaxpImplementationInfo("XPathFactory", XPathFactory.newInstance().getClass()));
System.out.println(getJaxpImplementationInfo("TransformerFactory", TransformerFactory.newInstance().getClass()));
System.out.println(getJaxpImplementationInfo("SAXParserFactory", SAXParserFactory.newInstance().getClass()));
}
private static String getJaxpImplementationInfo(String componentName, Class componentClass) {
CodeSource source = componentClass.getProtectionDomain().getCodeSource();
return MessageFormat.format(
"{0} implementation: {1} loaded from: {2}",
componentName,
componentClass.getName(),
source == null ? "Java Runtime" : source.getLocation());
}
次のサンプル出力は、3つの異なるJAXP実装(組み込みのXercesとXerces 2.8およびXalan用の外部JAR)の組み合わせを示しています。
DocumentBuilderFactory implementation: org.apache.xerces.jaxp.DocumentBuilderFactoryImpl loaded from: file:/C:/Projects/Scratch/lib/xerces-2.8.0.jar
XPathFactory implementation: com.sun.org.apache.xpath.internal.jaxp.XPathFactoryImpl loaded from: Java Runtime
TransformerFactory implementation: org.apache.xalan.processor.TransformerFactoryImpl loaded from: file:/C:/Projects/Scratch/lib/xalan.jar
SAXParserFactory implementation: org.apache.xerces.jaxp.SAXParserFactoryImpl loaded from: file:/C:/Projects/Scratch/lib/xerces-2.8.0.jar