2009-11-25 23 views
27

どのJAXP実装が使用されているか、どのJAXファイルがロードされたかに関する診断情報を提供したいと思います。これを達成するためのどのJAXP実装が使用されているか、どのJAXP実装がロードされたかを知るにはどうすればよいですか?

一つの方法は、例えば、のインスタンスでDocumentBuilderFactoryを作成し、そのクラスのプロパティを検査することである。

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()); 
} 

は、これを達成するためのより良い方法はおそらくなくても、ありますDocumentBuilderFactoryを作成しますか?

答えて

47

実際にインスタンスを作成せずに具体的なJAXPファクトリ実装が実装されることを予測するのはかなり難しいです。 Official JAXP FAQ(問14)から

:アプリケーションがDocumentBuilderFactory インスタンス 新しいJAXPを作成したい場合は

、それはstaic方法 DocumentBuilderFactory.newInstance()呼び出します。 これは 次の順序を使用して DocumentBuilderFactoryの 具象サブクラスの名前の検索が発生します。

  1. javax.xml.parsers.DocumentBuilderFactoryなどのシステムプロパティの値を、それが存在し、アクセス可能である場合。
  2. ファイル$JAVA_HOME/jre/lib/jaxp.propertiesの内容です。
  3. Jarファイル仕様で指定されたJarサービスプロバイダの検出メカニズム。 jarファイルは、具体化する具体的なクラスの名前を含むMETA-INF/services/javax.xml.parsers.DocumentBuilderFactoryのようなリソース(すなわち埋め込みファイル)を有することができる。
  4. フォールバックプラットフォームのデフォルトの実装。

この複雑さに加えて、個々のJAXPファクトリには、独立した実装を指定することができます。 1つのパーサー実装ともう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のミックス・アンド・マッチを示し、

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 
1

ですが、一般的にはありません。

DocumentBuilderFactory.newInstance()は、システムプロパティ "javax.xml.parsers.DocumentBuilderFactory"に設定されたDocumentBuilderFactoryの実装またはシステムプロパティが設定されていない場合はJREのデフォルトファクトリを返します。デフォルトのファクトリは、newInstanceメソッドの実装ではハードコーディングされている可能性が高く、それ以外の場合はアクセスできません。

システムプロパティが設定されている場合は、関連するクラスローダーでgetResourceメソッドを使用して、クラスローダーが対応するクラスファイルをロードするURLを取得できます。 jarファイルからのものであれば、jar:URLからファイル名(またはソースURL)を抽出できるはずです。クラスパスからメタデータファイルを手動で読み取ると、詳細なパッケージ情報も利用できるはずです。

システムプロパティが設定されていない場合は、すでに行っているように実際に新しいファクトリを作成せずに、探している情報を取得する方法がないと確信しています。

1

「フォールバックプラットフォームdefa」の前に検索される別の場所がありますULT実装」とJava Endorsed Standards Override Mechanism

に記載されているようすなわちjava.endorsed.dirsディレクトリ推奨規格オーバーライド機構は、承認規格またはスタンドアロンテクノロジを実装するクラスおよびインタフェースのそれ以降のバージョンがJavaプラットフォームに組み込まれてもよいができる手段を提供します。

+0

は、あなたがチェックすることができます。 – eckes

2

それは簡単です、あなただけの

System.setProperty("jaxp.debug", "1"); 

を設定したトラックは、あなたのwhick IMPL、およびwhick道のJAXPの使用を教えてくれます。

関連する問題