V10.0以降のバージョンに同梱しているJDK/JREでは、2つのJAXP実装を提供しています。
Apache Xalan 2.7.1、および Apache Xerces 2.9.1に基づくJAXP実装(以降、「Apache Xalanプロジェクトの提供するJAXP実装」と表記)
Oracle Corporationが配布するJDK/JREに含まれる実装と同等のJAXP実装(以降、「Oracle社の提供するJAXP実装」と表記)
JDK/JREのバージョン | V10.0.0より前 | V10.0.0~V10.1.0 | V11.0.0~V11.2.0 | V12.0.0以降 |
---|---|---|---|---|
5.0 | Oracle社の提供するJAXP実装 | ※1 | (-) | (-) |
6 | ※1 | (-) | ||
7 | (-) | (-) | ※1 | |
8 | (-) | (-) | (-) | Oracle社の提供するJAXP実装 |
※1)
Apache Xalanプロジェクトの提供するJAXP実装
インタプリタモードのトランスフォーマ(富士通製JDK/JREのデフォルトのトランスフォーマ)
プリコンパイルモードのトランスフォーマ
Oracle社の提供するJAXP実装
(-):同梱されていません。
Interstage Application Server V12.0.0より、JDK/JRE 7でのデフォルトのJAXP実装が、Apache Xalanプロジェクトの提供するJAXP実装から、Oracle社の提供するJAXP実装へ変更されます。なお、JDK/JRE 8ではApache Xalanプロジェクトの提供するJAXP実装は、同梱されておりません。
JDK/JRE 7で、Apache Xalanプロジェクトの提供するJAXP実装を利用できるようにするには、Java起動のオプションに以下を指定してください。
-XX:+UseFJXalan
JAXP実装の切替え方法(-XX:+UseFJXalan指定時)
Apache Xalanプロジェクトの提供するJAXP実装プリコンパイルモードへの切替え方法
javaコマンド実行時のオプションに以下を追加してください。
-Djavax.xml.transform.TransformerFactory=org.apache.xalan.xsltc.trax.TransformerFactoryImpl |
Oracle社の提供するJAXP実装への切替え方法
javaコマンド実行時のオプションに以下を追加してください。
-Dcom.fujitsu.jdkext.jaxp.impl.compat |
JAXP実装のバージョン変更に伴い、以下の点で注意が必要です。
XSLTの処理中のエラーについて
XSLTの処理中にエラーが発生した場合に、例外をスローしなくなります。
javax.xml.transform.ErrorListenerの仕様では、XSLTの処理中にエラーが発生しても、例外をスローしないことになっています。
詳細は、javax.xml.transform.ErrorListenerのJavaDocを参照してください。
しかし、Oracle社の提供するJAXP実装では、例外がスローされるようになっていました。Apache Xalanプロジェクトの提供するJAXP実装は、JAXPの仕様に従うため、例外をスローしないように変更されています。
このため、XSLTの処理中にエラーが発生した場合の動作が変わります。
XSLTの処理中にエラーが発生した場合のエラーハンドリング詳細についてはjavax.xml.transform.ErrorListener の JavaDocを参照してください。
javax.xml.parsers.SAXParser#setProperty()メソッド使用時の注意
javax.xml.parsers.SAXParser#setProperty()メソッドを使用してFeatureを設定できません。
Oracle社の提供するJAXP実装では、FeatureをsetProperty()メソッドで設定することが可能でした。しかし、Apache Xalanプロジェクトの提供するJAXP実装では、PropertyとFeatureを明確に区別するように変更されたため、setProperty()メソッドでFeatureを設定することができません。
setProperty()メソッドでFeatureを設定しようとした場合、以下の例外が発生する場合があります。
org.xml.sax.SAXNotRecognizedException: Property 'XXXX' is not recognized.
※XXXX:設定しようとしたFeature名
その場合は、SAXParserを取得するSAXParserFactoryのsetFeature()メソッドを使用しFeatureを設定するように変更してください。
XML文書のエンコーディング指定の解釈について
XML文書のエンコーディング指定の解釈が厳格になります。
Apache Xalanプロジェクトの提供するJAXP実装では、XML文書のxml宣言に指定するencoding属性の値を解釈する際に、XMLの仕様に沿ったチェックを行うようになります。
そのため、IANA(Internet Assigned Numbers Authority)で規定されていないエンコード名をencoding属性の値として指定した場合、以下の例外が発生する場合があります。
org.xml.sax.SAXParseException: Invalid encoding name "XXXX".
※XXXXはencoding属性に指定したエンコーディング名
たとえば、IANAに規定されていない「Shift-JIS」というエンコーディング名をxml文書のencoding属性に指定している場合、Apache Xalanプロジェクトの提供するJAXP実装では、例外が発生するようになります。(IANAでは「Shift_JIS」と規定されています。)
その場合は、XML文書のxml宣言中にあるencoding属性の値をIANAで規定されている正しいエンコーディング名に変更してください。
XMLパーサ、XSLTプロセッサの実装パッケージ名、クラス名について
XMLパーサ、XSLTプロセッサの実装パッケージ名、クラス名が変更になります。
この注意事項は、標準JAXP APIのみを使用しているアプリケーションには影響ありません。
Oracle社の提供するJAXP実装は、com.sun.org.apache.xxxというパッケージ名で提供されてきました。
Apache Xalanプロジェクトの提供するJAXP実装で使用されるパッケージ名/クラス名は、Apacheの配布するモジュールと同じになります。(org.apache.xxxというパッケージ名になります。)
Oracle社の提供するJAXP実装のクラスから、内部APIを使用するようなアプリケーションでは、import文や完全修飾名でクラスを使用している箇所があります。
Apache Xalanプロジェクトの提供するJAXP実装を利用するためには、import文や完全修飾名で指定している箇所を変更する必要があります。
デフォルトで動作するXMLパーサ、XSLTプロセッサについて
デフォルトで動作するXMLパーサ、XSLTプロセッサが変更になります。
標準JAXP APIを使用してXMLパーサやXSLTプロセッサをインスタンス化する場合、java実行時に各Factory経由でXMLパーサやXSLTプロセッサをインスタンス化します。使用するXMLパーサやXSLTプロセッサを利用者が明示的に指定していない場合、Oracle社の提供するJAXP実装では、com.sun.org.apache.xxxパッケージ配下のクラスが使用されていました。
Apache Xalanプロジェクトの提供するJAXP実装では、org.apache.xxxパッケージのクラスを使用するように変更されています。
また、Oracle社の提供するJAXP実装のクラスを使用する指定がなされていた場合にも、Apache Xalanプロジェクトの提供するJAXP実装であるorg.apache.xxxパッケージのクラスを使用するように変更しています。
任意のバージョンのXalanやXercesについて
任意のバージョンのXalanやXercesを、java実行時のオプション-classpath、-cp、またはCLASSPATH環境変数で指定しても、動作させることができません。
Apache Xalanプロジェクトの提供するJAXP実装は、java実行時のオプション-classpath、-cp、またはCLASSPATH環境変数の指定よりも、クラスパス検索順として優先度の高い位置に配置されます。
また、Apache Xalanプロジェクトの提供するJAXP実装は、Apacheの配布するモジュールとクラス名、パッケージ名が同じであるため、クラスパス検索順で先に見つかったもの(優先度の高いもの)が使用されます。
そのため、java実行時のオプション-classpath、-cp、またはCLASSPATH環境変数でApacheの配布する任意のバージョンのXalanやXercesをご使用の場合は、endorsedの機構を利用して使用してください。
指定方法の詳細は下記ドキュメントを参照してください。
「Java 推奨標準優先メカニズム」(JDK/JRE 7)
https://docs.oracle.com/javase/jp/7/technotes/guides/standards/
Apache Xalanプロジェクトの提供するJAXP実装使用時の性能が低下について
Apache Xalanプロジェクトの提供するJAXP実装を使用することにより性能が低下する場合があります。
Apache Xalanプロジェクトの提供するJAXP実装では、Oracle社の提供するJAXP実装のXSLT処理で使用していたXSLTCではなく、Apache Xalanプロジェクトでデフォルト動作しているインタプリタモードのトランスフォーマが使用されます。
そのため、アプリケーションの実装によっては性能が低下する場合があります。
性能が顕著に低下する場合は、XSLTCが有効になるようにjava実行時のオプションに以下を追加してください。
"-Djavax.xml.transform.TransformerFactory=org.apache.xalan.xsltc.trax.TransformerFactoryImpl"
互換性の影響などによりやむを得ず、Oracle社の提供するJAXP実装であるcom.sun.org.apache.xxxパッケージのXMLパーサ、XSLTプロセッサを使用する必要がある場合には、java実行時のオプションに以下を指定することで、Oracle社の提供するJAXP実装を使用することができます。
"-Dcom.fujitsu.jdkext.jaxp.impl.compat"
ただし、本オプションを指定した場合には、Apache Xalanプロジェクトの提供するJAXP実装は使用されません。