代码之家  ›  专栏  ›  技术社区  ›  mkoryak

java.lang.NoClassDefFoundError:HttpSessionListener

  •  2
  • mkoryak  · 技术社区  · 15 年前

    java.lang.NoClassDefFoundError: HttpSessionListener
    

    我知道HttpSessionListener住在 servlet-api.jar 它位于tomcat(我的应用服务器)的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
    

    我错过了什么?

    3 回复  |  直到 15 年前
        1
  •  3
  •   Stephen C    15 年前

    @巴卢斯的解释听起来比我的更合理。。。

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

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

    2. 有别的东西坏了,导致第一次尝试装载 HttpSessionListener 在静态初始化期间由于未捕获的异常而失败。(这有点难以置信,因为 是一个接口。但值得检查日志中是否存在早期的类加载错误。。。以防万一。)

    3. 丢失的类可能被命名为 foo.bar.HttpSessionListener javax.servlet.http.HttpSessionListener . 这可能会显示在嵌套堆栈跟踪中。

    4. 如果您正在部署的WAR中有什么东西正在创建自己的类加载器,则有可能是这样做不正确,并且 HttpSessionListener

    编辑

    如果您现在看到日志中报告了未解决的编译错误,您应该怀疑WAR文件和用于构建它的进程。特别是,听起来WAR包含了有Java编译错误的类!

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

        2
  •  3
  •   BalusC    15 年前

    根据 its javadoc

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

    1. 你的 web.xml 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根本不支持Servlet2.3,将返回到至少兼容的模式。但这可以排除,因为Tomcat6应该支持Servlet2.5。

    3. 实际上,在类路径中有另一个旧版本的ServletAPI JAR文件,该文件在类加载中具有优先权。因为你已经排除了 WEB-INF/lib JRE/lib JRE/lib/ext 文件夹。


    :根据您的编辑, FilterChain also 在ServletAPI版本2.3中引入。

        3
  •  1
  •   SuBZ    12 年前

    java.lang.NoClassDefFoundError:HttpSessionListener、ServletListener、ServletContextListener等上此NoClassDefFoundError的javax/servlet/ServletContextListener可能是由Tomcats server.xml文件中上下文定义中的自定义类加载器(如Sysdeo DevLoader)导致的。

    <Loader classname="org.apache.catalina.loader.DevLoader"
            reloadable="true" debug="1" />
    

    <Loader classname="org.apache.catalina.loader.DevLoader" 
            reloadable="true"
            debug="1" useSystemClassLoaderAsParent="false"/>