2

作成しなかった戦争を展開しようとしていますが、ログに次のエラーが表示されます。

java.lang.NoClassDefFoundError: HttpSessionListener

HttpSessionListenerがtomcat(私のアプリサーバー)のlibディレクトリにあるservlet-api.jarにあることを知っています。

戦争のWEB-INF/libフォルダーにservlet-api.jarを含めようとしましたが、ログはそれを行うために私に怒鳴りました:

INFO: validateJarFile(/home/test/apache-tomcat-6.0.18/webapps/test/WEB-INF/lib/servlet-api.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class

インターネットは、libフォルダにそのクラスを含める必要はないと主張しています。

編集: 問題のあるリスナー(上記の問題を引き起こしていた)をweb.xmlから削除しました。これは、あまり重要に見えなかったためです。これにより、より多くのエラーが明らかになりました。

java.lang.Error: Unresolved compilation problem: 
    The type javax.servlet.FilterChain cannot be resolved. It is indirectly referenced from required .class files

私は何が欠けていますか?

4

4 に答える 4

3

@BalusCの説明は私のものよりももっともらしいように聞こえます...

他のいくつかの可能な説明/チェックすること:

  1. servlet-api.jarが$CATALINA_HOME/ libにないか、何らかの理由でクラスが含まれていません。(私はあなたがそれがそこにあることを「知っている」とあなたが言ったことを知っています、しかしあなたはあなたがそれをチェックしたと特に言っていませんでした。)

  2. 他の何かが壊れているため、HttpSessionListener静的初期化中に最初に試行されたロードがキャッチされない例外で失敗しました。(これはインターフェイスであるため、ちょっと信じられないHttpSessionListenerことです。しかし、念のために、以前のクラスのロードエラーがないかログをチェックする価値があります。)

  3. 欠落しているクラスには、foo.bar.HttpSessionListenerではなく名前が付けられている可能性がありますjavax.servlet.http.HttpSessionListener。これは、ネストされたスタックトレースに表示される可能性があります。

  4. デプロイしているWAR内の何かが独自のクラスローダーを作成している場合、これが正しくHttpSessionListener行われておらず、クラスがクラスローダーの有効なクラスパス上にない可能性があります。

編集

ログに未解決のコンパイルエラーが報告されている場合は、WARファイルとそのビルドに使用されたプロセスが疑われるはずです。具体的には、WARにJavaコンパイルエラーが発生したクラスが含まれているようです。

(または、これはJSPのコンパイルの問題かもしれません...しかし、それはログにも表示されます。)

于 2010-10-11T00:05:46.950 に答える
3

そのjavadocによると、そのクラスはサーブレットAPIバージョン2.3で導入されました。

このエラーが発生した場合、基本的に3つの原因が考えられます。

  1. サーブレットweb.xml2.2以下として宣言されています(または誤って宣言されています。Tomcatは互換性が最も低いモードにフォールバックする可能性があります)。Java EE 5、つまりサーブレット2.5を使用しているため、は次のweb.xmlように宣言する必要があります。

    <web-app 
        xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
        id="YourWebAppID" version="2.5">
    
  2. ご使用のサーブレットコンテナはサーブレット2.3をまったくサポートしておらず、互換性が最も低いモードにフォールバックします。ただし、Tomcat 6はサーブレット2.5をサポートする必要があるため、これは除外できます。

  3. 実際には、クラスロードで優先される古いバージョンの別のサーブレットAPIJARファイルがクラスパスにあります。すでに除外しているのでWEB-INF/lib、次に見る場所はJRE/libJRE/lib/extフォルダになります。


更新:編集に従って、サーブレットAPIバージョン2.3でもFilterChain導入されました。

1 + 1 = ... :)

于 2010-10-11T00:08:48.160 に答える
3

質問は古すぎますが、今日起こりうる問題について教えてくれます。Tomcat 10ダウンロードページによると:

javax.*Tomcat 10以降のユーザーは、実装されているすべてのAPIのプライマリパッケージがからに変更されていることに注意する必要がありますjakarta.*。これには、アプリケーションをTomcat9以前からTomcat10以降に移行できるようにするためのコード変更がほぼ確実に必要になります。

したがって、10ではなくTomcat9を使用してください。

于 2021-06-16T18:04:27.543 に答える
1

java.lang.NoClassDefFoundError:HttpSessionListener、ServletListener、ServletContextListenerなどのこのNoClassDefFoundErrorのjavax / servlet / ServletContextListenerは、Tomcatのserver.xmlのコンテキスト定義にあるSysdeo DevLoader(Eclipseで使用する場合)などのカスタムクラスローダーによって発生する可能性があります。ファイル。

<Loader classname="org.apache.catalina.loader.DevLoader"
        reloadable="true" debug="1" />

そこに.....この使用法の代わりに...

<Loader classname="org.apache.catalina.loader.DevLoader" 
        reloadable="true"
        debug="1" useSystemClassLoaderAsParent="false"/>

DevLoader.jarをurクラスパスに追加します

于 2014-01-08T10:34:08.983 に答える