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的解释听起来比我的更合理……
其他一些可能的解释/检查事项:
-
servlet-api.jar不在$ CATALINA_HOME / lib中,或者由于某种原因不包含该类。 (我知道你说你“知道”它就在那里,但你没有具体说你检查了它。)
-
在静态初始化期间,其他一些内容被破坏导致第一次尝试加载
HttpSessionListener
失败并发生未捕获的exception。 (这有点难以置信,因为HttpSessionListener
是一个接口。但是为了以防万一,有必要检查日志以获取更早的类加载错误。) -
缺少的类可能名为
foo.bar.HttpSessionListener
而不是javax.servlet.http.HttpSessionListener
。 这可能会出现在嵌套堆栈跟踪中。 -
如果您正在部署的WAR中的某些内容正在创建自己的类加载器,则可能是这样做不正确并且
HttpSessionListener
类不在类加载器的有效类路径上。
编辑
如果您现在看到日志中报告的未解决的编译错误,您应该怀疑WAR文件以及用于构建它的过程。 具体来说,听起来WAR包含具有Java编译错误的类!
(或者这可能是编译JSP的问题……但是这也会出现在日志中。)
根据它的javadoc ,该类是在Servlet API 2.3版中引入的。
如果您收到此错误,那么它基本上可能有三个原因:
-
您的
web.xml
被声明为Servlet 2.2或更低版本(或声明不正确; Tomcat可能会回退到最低兼容性模式)。 由于您使用的是Java EE 5,因此使用的是Servlet 2.5,因此应该将web.xml
声明为: -
您的servlet容器根本不支持Servlet 2.3,并且会回归到最少的兼容性模式。 但是这可以被排除,因为Tomcat 6应该支持Servlet 2.5。
-
实际上,在类路径中有一个古老版本的另一个Servlet API JAR文件,它在类加载中占优势。 由于您已经排除了
WEB-INF/lib
因此下一个要查找的地方将是JRE/lib
和JRE/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添加到您的类路径