質問

現在、アプリケーションを本番環境から真新しいデータセンターに移行しています。

  • 現在の本番環境:Java 1.4、Java EE 3、WAS 5.1、JSF 2.1
  • 新しいデータセンター環境:Java 1.5、Java EE 5、WAS 6.1、JSF 2.1
このアプリケーションはJSF 2.1上に構築されており、AJAX呼び出しの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を組み込むほど簡単ではありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top