2011-10-17 19 views
9

私の現在のプロジェクトでは、JDK 1.6ランタイム環境をターゲットにしています。従来の理由では、Xerces JARファイルはアプリケーションにバンドルされています。JDK 1.6とXerces?

これらはもう不要ですか? JDKには、(しばらくの間)JDKにXML解析ライブラリがバンドルされていますか?

+0

なぜそれをバンドルせずに試してみませんか? –

+1

1.5よりも必要となることはありません。 1.6にはXercesの奇妙なフォークバージョンがあります。これは1.5とはちょっと違ったバージョンです。 @DaveNewtonによると、それがあなたのために働くかどうかを知る唯一の方法は、それを試すことです。 – bmargulies

+0

私は、私たちのプロジェクトにいくつかの依存解析ソフトウェアを動かさなければならないと思います。私たちが使っているオープンソースのフレームワークが、JAXPを使うのではなく、Xercesに直接依存しているのであれば、私は確信が持てません。 –

答えて

12

JAXPがJREに追加されたときに1.4以降にXMLパーサーをバンドルする必要はありません。 JAXPを使用し、Xercesを直接呼び出さないでください。内部的には、JREはXercesをバンドルして使用します(接頭辞は "com.sun")。

+3

これは正しいです。いくつかのグーグルの後では、JDK 1.4はJAXP 1.1をサポートしていて、Apacheには未チャージのクラス名でクラス分けされているようです。人々がJDKにバンドルされているものよりも新しいバージョンを使用したいときに問題が発生します。 (http://people.apache.org/~edwingo/jaxp-faq.html#JDK14) –

20

これらのXMLサービスは、いわゆる「サービスプロバイダ」メカニズムを使用してアプリケーション環境をプラグインします。

次のように動作します:

  1. 正確に使用しなければならないファクトリクラス、指すシステムプロパティを見つけようとします。例えば。 -Djavax.xml.parsers.SAXParserFactory=<some class>
  2. システムプロパティが見つからない場合、FactoryFinderは、特殊プロパティファイルでプロパティを検索します。例えば、${java.home}/lib/jaxp.properties
  3. fileプロパティが見つからなかった場合、FactoryFinderはクラスパスMETA-INF/services/<some service>のサービス記述を探します。 META-INF/services/javax.xml.parsers.SAXParserFactory。 ファクトリクラス名を含むファイルです(例:org.apache.xerces.jaxp.SAXParserFactoryImpl)。
  4. クラスパスにそのようなファイルがない場合、javaはデフォルトのファクトリ実装を使用します。

したがって、明白な工場クラスを指すシステムプロパティがない場合、javaは適切な実装を静かに選択します。

+1

私の質問に答えなかったとしても、非常に有用な答えをありがとう。 –

+4

これは、標準の静的な 'SAXParserFactory'コードの動作方法です。[link](http://docs.oracle.com/javase/7/docs/api/javax/xml/parsers/SAXParserFactory.html#newInstance%28 %29)といくつかの詳細があります。これは、初期のJDK/JREバンドルされたメカニズムを、選択したXMLライブラリと結合する方法です。また、JDK/JREバンドルされたXMLライブラリを、_Java承認済み標準オーバーライドメカニズムを使用して完全に置き換えることもできます。_ http://docs.oracle.com/javase/7/docs/technotes/guides/standards/ '-Djava.endorsed.dirs = path_to_folder_containing_new_library_jars'です。 –

11

JDKのパーサーはXercesのフォークですが、非常にバグです。私は、プロダクション・アプリケーションに常にApache版のパーサを優先的に使用することを推奨します。バグはまれですが、予測できず、実際には見られないコーナーケースに影響するだけではありません。私はかなり退屈なXML文書が解析され、破損したデータが属性値のアプリケーションに渡される多くのケースを見てきました。 Sun/Oracleは、この問題の修正に関心を示していません。毎回Apache Xercesを使用してください。

+1

こんにちは。 JDKパーサのバグに関するsomの参照/説明がありますか? JDKのバージョンは何を話していますか? –

+0

JDKパーサの問題に起因するSaxonのバグ・レポートを私が送ってきたときに、問題が発生したとしてもOracleに報告するのをやめました。だから、私は言及を引用することはできません。 –

1

承認された規格のオーバーライドメカニズムは問題なく機能します。 Djava.endorsed.dirs = path_to_folder_containing_new_library_jarsはJDK 1.6の問題を解決します。

私はThymleafの文脈で上記の解決策を確認しました。場合によっては、LEGACYHTML5モードにして、閉じられていないhtmlタグを自動修正するためにNekoHtmlパーサーを使用すると、 NekoはXerces jarsに依存します。クラスパスを設定しても問題は解決しません。

ありがとうs-n-ushakov。

関連する問題