ページの先頭です。
ここから本文です。

お知らせ

[WebOTX] 配備時のJSPプリコンパイルでクラス参照に失敗する問題と対策について

概要

EARに含まれるWARのJSPからEARのlibにあるJARファイルのクラスを参照している場合、 JSPプリコンパイルを有効にして配備すると、 クラスが見つけられずにJSPのコンパイルに失敗します。 その結果、配備自体も失敗します。


影響のある製品

  • WebOTX Application Server Express V9.1~V9.4
  • WebOTX Application Server Standard V9.1~V9.4
  • WebOTX Application Server Enterprise V9.1~V9.4

詳細

WebOTXでは、JSP初回アクセス時の性能を改善するために、 配備時にJSPをプリコンパイルする機能を提供しています。

この配備時のJSPプリコンパイルにはクラスパス構築処理に問題があり、 EARのlibにあるJARファイルがクラスパスに含まれません。

その結果、EARに含まれるWebアプリケーション(WAR)のJSPから EARのlibにあるJARファイルのクラスを参照している場合、 JSPプリコンパイル時にクラスが参照できずにコンパイルに失敗します。 この時、JSPプリコンパイルの失敗により、配備自体も失敗します。

JSP初回アクセス時のコンパイルではこの問題は発生しないため、 配備時にJSPプリコンパイルを行わない場合は、影響はありません。

また、EARに含まれない単体のWebアプリケーション(WAR)の場合は、 影響はありません。


対処方法

本問題を修正したWebOTXのパッチを以下で公開していますので適用してください。

上記以外の製品に対するパッチの公開時期は現在検討中です。 急ぎでパッチが必要な場合はご連絡ください。

(注意) パッチモジュールは製品保守契約を結んでいただいたお客様に限定して提供させていただいています。 まだ契約がお済みでないお客様は、保守契約締結の後、ダウンロードをお願いいたします。


回避方法

回避方法には以下の2通りの方法があります。

  1. 配備時のJSPプリコンパイルを行わない
  2. JSP初回アクセス時のコンパイルではこの問題は発生しないため、 配備時のJSPプリコンパイルを行わないことで、この問題を回避できます。

    JSP初回アクセス時のコンパイルにかかる時間が問題にならないのであれば、 こちらの回避方法を推奨します。

    コマンドから配備する場合は、 deployコマンドに--precompilejspオプションを指定しなければ、 配備時にJSPプリコンパイルは行われません。 (--precompilejspオプションの既定値はfalseです)

    運用管理ツールから配備する場合は、 「JSPコンパイル」にチェックを入れなければ、 配備時にJSPプリコンパイルは行われません。 (「JSPコンパイル」は既定でチェックが外れています)


  3. Webアプリケーション(WAR)に同じJARファイルを含める
  4. Webアプリケーション(WAR)のWEB-INF/libにあるJARファイルは、 配備時のJSPプリコンパイルのクラスパスに含まれます。

    そのため、EARのlibにあるJARファイルを Webアプリケーション(WAR)のWEB-INF/libにも含めることで、 この問題を回避できます。

    なお、アプリケーション実行時には、WEB-INF/libに置かれたJARファイルよりも、 EARのlibに置かれたJARファイルが優先されるため、 アプリケーション実行時の動作に影響はありません。

    ただし、Webアプリケーションのクラスロード処理の優先順位の設定(※)で、 Webアプリケーションのクラスローダを優先するよう設定している場合は、 アプリケーション実行時にもWEB-INF/libのJARファイルが優先して参照されるため、 アプリケーション実行時の動作に影響があります。

    アプリケーションの作りによっては、EARのlibとWEB-INF/libの2箇所から 同じ名前のクラスがロードされる場合があります。 これらはロードするクラスローダが異なるため、 同じ名前でも異なるクラスとみなされClassCastException等の原因になります。

    この場合は、1つ目の回避方法をご検討ください。

    (※)
    クラスロード処理の優先順位の制御は、 WEB-INF/nec-web.xmlの要素<class-loader>の属性delegateで指定します。 delegate="true"の場合は、親クラスローダが優先されます。 delegate="false"の場合は、Webアプリケーションのクラスローダが優先されます。

    要素<class-loader>を省略した場合や、 WEB-INF/nec-web.xmlそのものを省略した場合の属性delegateのデフォルト値は、 Servletのバージョンによって異なります。 Servlet 2.4以降では属性delegateのデフォルト値は"true"であり、 Servlet 2.3以前は"false"です。


更新履歴

  • 2016/07/15 初版
  • 2017/01/31 第2版 対処方法にパッチモジュールを追記

製品名カテゴリ

WebOTX
WebOTX Application Server

  • コンテンツID: 3010101763
  • 公開日: 2016年07月12日
  • 最終更新日:2018年10月15日
ここからページ共通メニューです。 ページ共通メニューを読み飛ばす。