java.lang.NoClassDefFoundError: HttpSessionListener - PullRequest
2 голосов
/ 11 октября 2010

Я пытаюсь развернуть войну, которую я не написал, и я получаю эту ошибку в своих журналах:

java.lang.NoClassDefFoundError: HttpSessionListener

Я знаю, что HttpSessionListener живет в servlet-api.jar который находится в директории lib tomcat (мой сервер приложений).

Я пытался включить 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.

edit: я удалил прослушивающего слушателя (который вызывал проблему выше) из 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 ]

3 голосов
/ 11 октября 2010

Согласно его 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. Ваш сервлет-контейнер вообще не поддерживает Servlet 2.3 ивернется к режиму наименьшей совместимости.Но это можно исключить, поскольку Tomcat 6 должен поддерживать Servlet 2.5.

  3. На самом деле у вас есть еще один JAR-файл Servlet API старой версии в classpath, который имеет приоритет при загрузке классов.Так как вы уже исключили WEB-INF/lib, следующие места для поиска будут JRE/lib и JRE/lib/ext папки.


Обновление : согласно вашему редактированию, FilterChain было также введено в Servlet API версии 2.3.

1 + 1 = ...:)

3 голосов
/ 11 октября 2010

@ Объяснение BalusC звучит более правдоподобно, чем мое ...

Некоторые другие возможные объяснения / вещи для проверки:

  1. servlet-api.jar не находится в $ CATALINA_HOME / lib или по какой-то причине не содержит класс. (Я знаю, что вы сказали, что «знаете», что это там, но вы не сказали, что проверяли.)

  2. Произошло что-то еще, что привело к сбою первой попытки загрузки HttpSessionListener с неперехваченным исключением во время статической инициализации. (Это неправдоподобно, поскольку HttpSessionListener - это интерфейс. Но стоит проверить журналы на предмет более ранних ошибок загрузки классов ... на всякий случай.)

  3. Недостающий класс может быть назван foo.bar.HttpSessionListener, а не javax.servlet.http.HttpSessionListener. Скорее всего, это проявится в трассировке вложенного стека.

  4. Если что-то в развертываемой вами WAR создает собственный загрузчик классов, возможно, это происходит неправильно, и класс HttpSessionListener не входит в эффективный путь к загрузчику классов.

EDIT

Если вы теперь видите неразрешенные ошибки компиляции, зарегистрированные в журналах, вы должны подозревать файл WAR и процесс, использованный для его создания. В частности, похоже, что WAR включает классы, в которых были ошибки компиляции Java!

(Или, может быть, это проблема компиляции JSP ... но это также будет отображаться в журналах.)

1 голос
/ 08 января 2014

java.lang.NoClassDefFoundError: javax / servlet / ServletContextListener для этого NoClassDefFoundError в HttpSessionListener, ServletListener, ServletContextListener и т. Д. Могут быть вызваны пользовательским загрузчиком классов, таким как Sysdeo DevLoader, с использованием метода Sysdeo в качестве носителя (с помощью метода Sysdeo DevLoader) ( файл 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 в путь к классам

...