7

Websphere v6.1 の Web モジュール クラスパスに問題があります。

私の WEB-INF/lib には、xercesImpl.jar と xmlparserv2.jar を含む多数の jar ファイルがあります。両方の jar が存在する必要がありますが、互いに競合しているようです。具体的には、各 jar には META-INF/services ディレクトリが含まれているため、JAXP 経由で DocumentBuilderFactory のインスタンスを取得しようとすると、どのインスタンスを取得するかは、これら 2 つの jar がクラスパスに表示される順序によって異なります。

DocumentBuildFactory の xerces インスタンスを常に使用したいので、xercesImpl.jar をクラスパスの先頭にプッシュします。war ファイルのマニフェスト ファイルで Class-Path セクションを指定してこれを実行しようとしましたが、実際に WAS Module Compound CLass Loader で取得するクラス パスは非常に奇妙です。WAS が配置する標準的なものをいくつか取得したようです。その後に、WEB-INF lib の内容がアルファベット順に続き、その後にマニフェスト ファイルで指定されたクラスパスが続きます。

マニフェスト ファイルを戦争にまったく入れない場合、標準的なものに続いて WEB-INF/lib の内容が任意の順序で取得されます。

私は何が欠けていますか?クラスパスを正確に希望どおりに設定する方法はありますか?

デイブ

4

4 に答える 4

4

IBM Websphere Application Server 6.1 では、Web モジュールには通常 PARENT_FIRST モードで使用される独自のクラス ローダーがあります。これは、Web モジュール クラス ローダーが、新しいクラスをロードする前に、クラスのロードを親クラス ローダーに委任しようとすることを意味します。

Xerces クラスを XML パーサー v2 (私は Oracle XML v2 パーサーを想定しています) クラスの前にロードしたい場合は、Xerces クラスを親クラス ローダー (この場合はアプリケーション クラス ローダーが望ましい) によってロードする必要があります。 . これを行うには、Xerces jar を EAR ファイル (ある場合) のルートに配置するか、ルートに xerces.jar と WAR ファイルを含む EAR ファイルを準備します。次に、xmlparserv2 jar を WEB-INF\lib に配置する必要があります。

アプリケーションで使用する Xerces 共有ライブラリを作成することもできます。

これについて詳しくは、IBM WebSphere Application Server V6.1: System Management and Configuration を参照してください。詳細は第 12 章を参照してください。

于 2009-01-09T19:05:36.813 に答える
4

WebSphere とは、通常の J2EE Application Server を意味していると思います (Community Edition のようなものではありません。WebSphere は、多くの IBM 製品に適用されるブランド名です)。

あなたの選択肢は限られていると思います。依存関係は非常に明示的に見えるので、クラスパスの気まぐれに頼るよりもプログラムによるアプローチを好みます (SPI に頼るのではなく、ファクトリ インスタンスを明示的に作成するなど)。

それができない場合は、依存関係の 1 つを EAR プロジェクト ユーティリティ JAR にして、WAR で PARENT_LAST クラスローディング ポリシーを使用して MODULE クラスローディングを構成することを検討してください。これは、ブラウザの管理コンソール (またはRADツールを使用している場合) を介して構成できます。

もう 1 つ注目したいのは、WAS共有ライブラリ機能です (ブラウザー管理コンソールの [環境] の下にあります)。これらは、サーバーまたはアプリケーションに関連付けることができます。欠点は、これにはより多くの構成が必要になることです。

于 2009-01-09T18:37:48.617 に答える
1

JAXP がパーサーを選択する方法

このプログラムが実際にどのパーサーを使用しているのか疑問に思うかもしれません。結局のところ、JAXP は適度にパーサーに依存しません。答えは、クラスパスにインストールされているパーサーと、特定のシステム プロパティの設定方法によって異なります。デフォルトでは、javax.xml.parsers.DocumentBuilderFactoryシステム プロパティによって指定されたクラスが使用されます。たとえば、ドキュメントの解析に Xerces が使用されていることを確認する場合は、次のように JAXPChecker を実行します。

D:\books\XMLJAVA>java -Djavax.xml.parsers.DocumentBuilderFactory=org.apache.xerces.jaxp.DocumentBuilderFactoryImpl  JAXPChecker file:///D:/books/xmljava/dom.xml
> file:///D:/books/xmljava/dom.xml is well-formed.

プロパティが設定されていない場合、javax.xml.parsers.DocumentBuilderFactoryJAXP は JRE ディレクトリの lib/jaxp.properties プロパティ ファイルを調べて、javax.xml.parsers.DocumentBuilderFactoryシステム プロパティのデフォルト値を決定します。たとえば、特定の DOM パーサーを一貫して使用する場合はgnu.xml.dom.JAXPFactory、そのファイルに次の行を追加します。

javax.xml.parsers.DocumentBuilderFactory=gnu.xml.dom.JAXPFactory

これでパーサーが見つからない場合、次に JAXP はMETA-INF/services/javax.xml.parsers.DocumentBuilderFactory、ランタイムで使用可能なすべての JAR ファイル内のファイルを探して、具体的なDocumentBuilderFactoryサブクラスの名前を見つけます。

最後に、それが失敗した場合DocumentBuilderFactory.newInstance()は、デフォルトのクラスを返します。通常は、JAXP クラスも提供しているベンダーのパーサーです。たとえば、JDK JAXP クラスorg.apache.crimson.jaxp.DocumentBuilderFactoryImplはデフォルトで選択しますが、Ælfred JAXP クラスはgnu.xml.dom.JAXPFactory代わりに選択します。

于 2010-03-01T17:03:29.743 に答える
0

実装を優先するようにシステム プロパティを設定することもできます。たとえば、xmlparserv2 dom パーサーを優先するには、javax.xml.parsers.DocumentBuilderFactory=oracle.xml.jaxp.JXDocumentBuilderFactory を設定します。

于 2009-11-10T10:00:36.380 に答える