0

TomcatにWebアプリケーションがあります。アプリケーションには2つのSAXParserFactory実装が必要です。1つはJDKのデフォルトの実装com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImplで、もう1つはxercesからのものですorg.apache.xerces.jaxp.SAXParserFactoryImpl

ここに問題があります。次のように、特定の順序で1つの実装のみSAXParserFactory.newInstance()を選択します。

  • javax.xml.parsers.SAXParserFactoryシステムプロパティを使用します。
  • 上記で定義したシステムプロパティと同じ値でキー設定された実装クラスの名前を含むプロパティファイルには、JAVA_HOME(jdkがインストールされている親ディレクトリ)/lib/jaxp.propertiesを使用します。
  • 可能な場合は、Services API(JAR仕様で詳しく説明されています)を使用して、クラス名を判別します。Services APIは、ランタイムで使用可能なjar内のファイルMETA-INF / services/javax.xml.parsers.SAXParserFactoryでクラス名を検索します。
  • プラットフォームのデフォルトのSAXParserFactoryインスタンス。

javax.xml.parsers.SAXParserFactoryのさまざまなクラス名をさまざまなjarファイルで構成しようとしました。しかし、それはクラスローダー全体の範囲です。Tomcatでは、すべてのアプリケーションライブラリが1つのクラスローダーにロードされます。たとえば、A.jarの構成ファイルはB.jarの構成を上書きし、最終的にはすべてのアプリケーションがA.jarから構成を取得します。

だから私の質問は、これら2つのSAXParserFactory実装を1つのWebアプリケーションでどのように特定できるかということです。ありがとうございました。

4

2 に答える 2

0

(複数のクラスローダーを使用しない限り)できないことはかなり確実です。他の実装に依存するコードは、(実装クラス名を使用して)直接インスタンス化する必要があります。

于 2012-08-27T15:37:25.393 に答える
-1

使用する実装は、次の方法で定義することもできます。

-Djavax.xml.parsers.SAXParserFactory=com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl

javaコマンドライン引数として。

于 2022-01-25T11:24:44.177 に答える