WebアプリケーションでClassNotFoundException、NoClassDefFoundErrorが発生する場合の対処

対象となるクラスが、そのクラスを参照しているクラスから参照できなくなっている 可能性があります。WebOTXでは、Jakarta Commonsのライブラリを”WebOTX/lib”に格納しています。 それらWebOTXで格納しているクラスはWebアプリケーションのクラスローダより上位のクラスローダで ロードされており、WebアプリケーションのWEB-INF/libのクラスがクラスローダの上下関係で 参照できなくなっている可能性があります。
もしくは、対象のクラスが、javaxのパッケージの場合には、Servletの仕様により、WEB-INF配下から 読み込めないことがあります。これは、Servlet仕様での勧告(javaxなどのJ2SE,J2EEクラスを WAR内のライブラリでオーバライトさせるべきでない、という仕様のためです。

WebOTXで同梱しているライブラリとクラスのロードについては [リファレンス集ドメイン構成・環境移行編 > 2. TomcatからWebOTXへの移行ガイド] の [2.2.4. 同梱するライブラリ] と [2.2.5. クラスのロードについて]を参照してください。

  1. クラスのロード処理を変更する
    nec-web.xmlのdelegate指定を変更することにより、クラスのロード処理を変えて、アプリケーションの 動作を確認してください。

    もしくは、WEB-INF/libにあるWebOTXで同梱されているライブラリ(例えばcommons-logging*.jar など)を削除して、アプリケーションの動作を確認してください。
    nec-web.xmlのdelegate指定の変更は、次章の[配備でエラーが発生 する]を参照してください。

  2. javaxパッケージをWEB-INF配下から読み込み利用可能にする
    javaxパッケージは、WEB-INF配下から読み込みません。 javaxパッケージを ${INSTANCE_ROOT}/lib 配下に移動するか、nec-web.xmlにoverrideablejavaxpackagesのを設定して利用可能にする必要があります。

    • nec-web.xml設定方法

      <?xml version="1.0" encoding="UTF-8"?>
      <nec-web-app>
          :
        <class-loader delegate="false">
          <property name="overrideablejavaxpackages" value="パッケージ名"/>
        </class-loader>
          :
      

      パッケージ名はカンマ区切りで複数指定可能です。


    補足としてprocessLauncher.xmlにoverrideablejavaxpackagesを設定をすることで全Webアプリケーションに対しての設定を行うこともできます。 ${AS_INSTALL}/lib/processLauncher.xml を次のように編集します。

    • processLauncher.xml設定方法

      <?xml version="1.0"?>
      <processes>
          <process name="webotx-server">
                  :
              <sysproperty key="com.nec.webotx.enterprise.overrideablejavaxpackages"
                  value="javax.help,javax.portlet,パッケージ名"/>
                  :
      

      パッケージ名はカンマ区切りで複数指定可能です。

      設定後はドメインを再起動してください。

    overrideablejavaxpackagesで指定したパッケージはチェックするクラスがそのパッケージ名で 始まっていれば対象となります。
    ですので、javax.xml.wsを指定していただければサブパッケージのjavax.xml.ws.handlerやjavax.xml.ws.handler.soap等も 対象となります。個別に指定する必要はありません。


関連情報