我正在尝试发动一场我没有写过的战争,并且我的日志中出现此错误:

java.lang.NoClassDefFoundError: HttpSessionListener


我知道HttpSessionListener存放在Tomcat的lib目录(我的应用服务器)中的servlet-api.jar中。

我尝试将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


我想念什么?

最佳答案

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

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


servlet-api.jar不在$ CATALINA_HOME / lib中,或者由于某种原因不包含该类。 (我知道您说过您“知道”它在那儿,但您没有明确地说您已检查它。)
某些其他问题已损坏,这导致第一次尝试加载HttpSessionListener的操作在静态初始化期间因未捕获的异常而失败。 (由于HttpSessionListener是一个接口,这有点难以置信。但是,为防万一,值得检查日志中是否有较早的类加载错误……)
缺少的类可能被命名为foo.bar.HttpSessionListener而不是javax.servlet.http.HttpSessionListener。这很可能会显示在嵌套堆栈跟踪中。
如果您要部署的WAR中的某些内容正在创建自己的类加载器,则可能是这样做做错了,并且HttpSessionListener类不在类加载器的有效类路径上。


编辑

如果现在在日志中看到未解决的编译错误,则应该怀疑WAR文件及其生成过程。具体来说,听起来WAR包含具有Java编译错误的类!

(或者这可能是编译JSP时遇到的问题……但是它也会显示在日志中。)

关于java - java.lang.NoClassDefFoundError:HttpSessionListener,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3902705/

10-10 02:13