java.lang.NoClassDefFoundError:HttpSessionListener

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

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 

我错过了什么?

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

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

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

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

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

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

编辑

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

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

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

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

  1. 您的web.xml被声明为Servlet 2.2或更低版本(或声明不正确; Tomcat可能会回退到最低兼容性模式)。 由于您使用的是Java EE 5,因此使用的是Servlet 2.5,因此应该将web.xml声明为:

      
  2. 您的servlet容器根本不支持Servlet 2.3,并且会回归到最少的兼容性模式。 但是这可以被排除,因为Tomcat 6应该支持Servlet 2.5。

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


更新 :根据您的编辑, FilterChain 也在 Servlet API 2.3版中引入。

1 + 1 = …… 🙂

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

  

有……这种用途……

  

并将DevLoader.jar添加到您的类路径