JavaEE 5、WAS 6.0 JSPの奇妙な問題には以下が含まれます
質問
現在、アプリケーションを本番環境から真新しいデータセンターに移行しています。
- 現在の本番環境:Java 1.4、Java EE 3、WAS 5.1、JSF 2.1
- 新しいデータセンター環境:Java 1.5、Java EE 5、WAS 6.1、JSF 2.1
request.getSession().getServletContext().getRequestDispatcher( "/results.faces").include(request, response);そして、ここで問題に遭遇します。
ケース1:標準仕様
によるEAR構造。 EAR->戦争-> WEB-INF-> lib-> * .jar(すべてのアプリケーション固有のjarはWEB-INF / libの下にあります)。これは機能せず、クラスローダーによって見つからないクラスの例外を取得し続けます。また、上記のAJAX呼び出しは失敗します(出力は生成されません)
ケース2:EARにはルート上のすべてのアプリケーションJARファイルが含まれます(MANIFEST.MFには手動で指定されたクラスパスがあります)。
このアプローチは完全に機能し、すべてのJARファイルは問題なくロードされます。さらに、AJAX呼び出しも正常に実行されます。
これがなぜ起こる可能性があるかのアイデア。
- アッシュ語
解決
はい、Java EEアプリサーバーには、次のようなクラスローダーの階層があるためです。最初にブートストラップクラスローダーが呼び出されます。次はEARレベルのクラスローダー、次にWARレベルのクラスローダーです。上位レベルのクラスローダーは、必要なクラスを探しません。必要なものが見つからない場合、ClassNotFoundExceptionがスローされます。
したがって、WEB-INF / libのJARはEARレベルのクラスローダーからは見えませんでした。これらのJARを上に移動すると、問題が解決します。また、これらのすべてのJARがEARのすべてのWARに表示されます。
確認したいことの1つは、web.xmlおよびその他のファイルの仕様です。サーブレットとJSPの仕様は途中で変更されたため、JSTLなどのJARはバージョン1.0から1.1になりました。 web.xmlとすべてのJARを注意深くチェックして、Java EEアプリサーバーでサポートされている仕様と一致することを確認することをお勧めします。
残念ながら、アプリサーバーのアップグレードは、EARまたはWARを組み込むほど簡単ではありません。