2009-05-06 11 views
3

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のライブラリを変更することはできません。提案?

答えて

0

クラスパスにコモンズを明示的に記録していますか?あなたはjvm classpathと言ったので、iPlanetを起動するときにコマンドラインで指定していると仮定します。これは、J2EEアプリケーションでjarをロードするための推奨方法ではありません。

最も簡単なことは、iPlanetに付属のcommons logging jarをApacheライブラリに使用させるのが最も簡単なことです。 WEB-INF/libディレクトリまたはクラスパス設定にcommons-logging.jarを置かないでください.iPlanetを自動的に取得する必要があります。

0

iplanetに精通していませんが、WebSphereでは、アプリケーションのクラスローディング・ポリシーをPARENT_LASTに設定できます。これにより、アプリケーションのクラスローダー内のすべてがロードされてから、親プロセスが表示されます。これは、あなたの設定が似ていると仮定すると、この種の問題を解決するはずです。

これは、自分のアプリケーションにすべての依存関係を指定する必要があることを意味します(とにかくベストプラクティスです)。

+0

デフォルトのJavaクラスの読み込み方針であるPARENT FIRSTは、これまで書かれたほぼすべてのJavaクラスに組み込まれています。これらのクラスは、その戦略の下でテストされ、試されました。ただし、他のクラスローディング戦略の下で動作する保証はありません。 PARENT LASTクラスのローディング戦略に切り替えることは、ほとんどの場合、開発の数ヶ月後に何かすぐに後悔することがあります。 PARENT LASTを使用すると、現在の問題を解決できる可能性がありますが、あなたが望むものではない可能性が最も高いです。 –

+1

@Steven Devijver私はこのような問題を抱えておらず、一部のアプリケーションをJEEタイプの環境で動作させる唯一の方法です。また、あなたがあなたと思う依存クラスのバージョンを使用していることを保証する唯一の方法です。独自のアプリケーションの独立性を容易に妨げるクラスパス(特にXML解析のためのクラス)が常にあります。このシナリオでは失敗すると思いますか?クラスは引き続き解決され、アプリケーションでバンドルしたバージョンは、他の場所で定義されているバージョンの代わりに使用されます。 – Robin

関連する問題