iPlanetのJavaアプリケーションサーバーを実行していますが、その中にはcommons-logging-1.0.4.jar
がロードされています。無効なクラスローダー階層を回避するにはどうすればよいですか?
私のアプリケーションの1つがAuthSSLProtocolSocketFactory
(これはcommons-logging
も使用する別のapacheライブラリ)を呼び出すまでは問題ありません。
私は、JVMのクラスパスにjarファイルを入れて、このエラーを取得:
Invalid class loader hierarchy. You have more than one version of 'org.apache.commons.logging.Log' visible, which is not allowed. (Caused by org.apache.commons.logging.LogConfigurationException: Invalid class loader hierarchy....
commons-logger
は異なるクラスローダにロードされた自身の2つのインスタンスを持つ好きではないようです。私は、アプリケーションサーバがそれを初めてロードしているクラスローダを持っていると仮定しています(アプリケーションサーバコンフィグレーションを見つけることができません)ので、アプリケーションをロードしてその例外をスローします。
私はWebサーバーを変更できません。また、Apacheのライブラリを変更することはできません。提案?
デフォルトのJavaクラスの読み込み方針であるPARENT FIRSTは、これまで書かれたほぼすべてのJavaクラスに組み込まれています。これらのクラスは、その戦略の下でテストされ、試されました。ただし、他のクラスローディング戦略の下で動作する保証はありません。 PARENT LASTクラスのローディング戦略に切り替えることは、ほとんどの場合、開発の数ヶ月後に何かすぐに後悔することがあります。 PARENT LASTを使用すると、現在の問題を解決できる可能性がありますが、あなたが望むものではない可能性が最も高いです。 –
@Steven Devijver私はこのような問題を抱えておらず、一部のアプリケーションをJEEタイプの環境で動作させる唯一の方法です。また、あなたがあなたと思う依存クラスのバージョンを使用していることを保証する唯一の方法です。独自のアプリケーションの独立性を容易に妨げるクラスパス(特にXML解析のためのクラス)が常にあります。このシナリオでは失敗すると思いますか?クラスは引き続き解決され、アプリケーションでバンドルしたバージョンは、他の場所で定義されているバージョンの代わりに使用されます。 – Robin