java.lang.NoClassDefFoundError:HttpSessionListener

时间:2010-10-10 23:53:02

标签: java tomcat java-ee-5

我正在尝试部署一个我没写过的战争,我在日志中收到了这个错误:

java.lang.NoClassDefFoundError: HttpSessionListener

我知道HttpSessionListener位于tomcat(我的app服务器)的lib目录中的 servlet-api.jar 中。

我尝试在war的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 个答案:

答案 0 :(得分:3)

@ BalusC的解释听起来比我的更合理......

其他一些可能的解释/事项:

  1. servlet-api.jar不在$ CATALINA_HOME / lib中,或者由于某种原因不包含该类。 (我知道你说你“知道”它就在那里,但你没有具体说你检查了它。)

  2. 在静态初始化期间,由于未捕获的异常导致第一次尝试加载HttpSessionListener失败导致其他内容被破坏。 (这有点难以置信,因为HttpSessionListener是一个接口。但是为了以防万一,有必要检查日志中的早期类加载错误。)

  3. 缺少的类可能被命名为foo.bar.HttpSessionListener而不是javax.servlet.http.HttpSessionListener。这可能会出现在嵌套堆栈跟踪中。

  4. 如果要部署的WAR中的某些内容正在创建自己的类加载器,则可能是这样做不正确且HttpSessionListener类不在类加载器的有效类路径中。

    < / LI>

    修改

    如果您现在看到日志中报告的未解决的编译错误,您应该怀疑WAR文件以及用于构建它的过程。具体来说,听起来WAR包含具有Java编译错误的类!

    (或者这可能是编译JSP的问题......但这也会出现在日志中。)

答案 1 :(得分:3)

根据its javadoc,该类是在Servlet API 2.3版中引入的。

如果您收到此错误,则基本上可能有三个原因:

  1. 您的web.xml被声明为Servlet 2.2或更低版本(或声明不正确; Tomcat可能会回退到最低兼容性模式)。由于您使用的是Java EE 5,因此使用的是Servlet 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. 您的servlet容器根本不支持Servlet 2.3,并且会回归到最少的兼容性模式。但是这可以被排除,因为Tomcat 6应该支持Servlet 2.5。

  3. 实际上,在类路径中有一个古老版本的另一个Servlet API JAR文件,它在类加载中占优势。由于您已排除WEB-INF/lib,因此下一个要查看的地方将是JRE/libJRE/lib/ext个文件夹。


  4. 更新:根据您的修改,Servlet API 2.3版中引入了FilterChain also

    1 + 1 = ...:)

答案 2 :(得分:1)

java.lang.NoClassDefFoundError:HttpSessionListener,ServletListener,ServletContextListener等上的NoClassDefFoundError的javax / servlet / ServletContextListener可能是由Tomcat的上下文定义中的Sysdeo DevLoader(当与Eclipse一起使用时)等自定义类加载器引起的server.xml文件。

<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添加到您的类路径

答案 3 :(得分:0)

虽然这个问题太老了,但现在可以说明一个可能的问题。根据{{​​3}}:

<块引用>

Tomcat 10 及以后的用户应注意,...所有已实现 API 的主要包已从 javax.* 更改为 jakarta.*。这几乎肯定需要更改代码才能使应用程序从 Tomcat 9 及更早版本迁移到 Tomcat 10 及更高版本。

所以使用 Tomcat 9 而不是 10。