我正在尝试发动一场我没有写过的战争,并且我的日志中出现此错误:
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/