2

我正在尝试部署我没有编写的战争,并且在我的日志中收到此错误:

java.lang.NoClassDefFoundError: HttpSessionListener

我知道 HttpSessionListener 存在于servlet-api.jar中,它位于 tomcat(我的应用服务器)的 lib 目录中。

我尝试将 servlet-api.jar 包含在战争的 WEB-INF/lib 文件夹中,但日志对我大喊大叫:

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,该类是在 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. 您的 servletcontainer 根本不支持 Servlet 2.3,并且会退回到最低兼容性模式。但这可以排除,因为 Tomcat 6 应该支持 Servlet 2.5。

  3. 您实际上在类路径中有另一个古老版本的 Servlet API JAR 文件,该文件在类加载中具有优先权。由于您已经排除WEB-INF/lib了下一个要查看的位置JRE/libJRE/lib/ext文件夹。


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

1 + 1 = ... :)

于 2010-10-11T00:08:48.160 回答
3

虽然这个问题太老了,但现在会说明一个可能的问题。根据Tomcat 10 下载页面

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

所以使用 Tomcat 9 而不是 10。

于 2021-06-16T18:04:27.543 回答
1

java.lang.NoClassDefFoundError: javax/servlet/ServletContextListener for this NoClassDefFoundError on HttpSessionListener , ServletListener , ServletContextListener 等可能是由自定义类加载器引起的文件。

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

于 2014-01-08T10:34:08.983 回答