[Java] JAXP 1.5 in JDK8 repository, b90

原文はこちら。
https://blogs.oracle.com/joew/entry/jaxp_1_5_in_jdk8

JAXP 1.5がJDK8リポジトリに入っています。互換性のない変更のため、開発チームの一部には既に影響があると感じている者もいますが、皆様がこの変更に関連する問題を特定する上でこのエントリが役立つことを願っています。
JEP 185をご覧下さい。
JEP 185: JAXP 1.5: Restrict Fetching of External Resources
http://openjdk.java.net/jeps/185
JDK8では、新しい外部アクセスプロパティがJAXP 1.5で導入されます。これはデフォルトでDOM/SAX/StAXパーサーやスキーマ検証、XSLTの場合はローカルファイルシステムへのアクセスを禁止するように設定されています。アプリケーションがDTD、XSD、XSLなどの外部リソースへのアクセスを必要とするXMLファイルを処理する際に、最新のJDK8で動作するシステムやアプリケーションはアクセスエラーが発生する可能性があります。互換性の影響はJDK8以後で再評価され、その評価によってデフォルト設定が変わる可能性があります。

現在のビルドにおけるエラーメッセージは以下のようです。メッセージはエラーメッセージの改善を要求するEnhancement Request(JDK-8015016)により変わる可能性があります。
org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 163; External DTD: Failed to read external DTD 'properties.dtd', because 'http' access is not allowed.
以下のサンプルコードではこの新しいプロパティを使って問題を修正しています。
enableExternalAccess(parser, "http") ;  // or "all" to allow all access
    /**
     * Configure the parser to allow external access to DTDs by the protocol.
     */
    public static void enableExternalAccess(SAXParser parser, String protocol) throws SAXNotSupportedException  {
        try {
            parser.setProperty("http://javax.xml.XMLConstants/property/accessExternalDTD", protocol);
        }
        catch (SAXNotRecognizedException ignore) {
            // property requires >= JAXP 1.5
        }
    }
アプリケーションやシステム全体のためにこの制限を解除することが望ましいならば、このシステムプロパティ(例えばこの場合はjavax.xml.accessExternalDTD)やjaxp.propertiesファイルを使うことができます。詳細はJEP 185をご覧下さい。

0 件のコメント:

コメントを投稿