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