2010-10-10 9 views
2

Je suis en train de déployer une guerre que je na pas écrire et je reçois cette erreur dans mes journaux:java.lang.NoClassDefFoundError: HttpSessionListener

java.lang.NoClassDefFoundError: HttpSessionListener 

Je sais que vit HttpSessionListener dans servlet-api.jar qui se trouve dans le répertoire lib de tomcat (mon serveur d'applications).

J'ai essayé, y compris servlet-api.jar dans le dossier WEB-INF/lib de la guerre, mais les journaux m'a crié dessus pour le faire:

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 

les internets affirment que vous ne devez inclure cette classe dans votre dossier lib.

modifier: i enlevé l'auditeur incriminé (qui était à l'origine du problème ci-dessus) de web.xml car il n'a pas l'air très important. Cela a révélé plus d'erreurs:

java.lang.Error: Unresolved compilation problem: 
    The type javax.servlet.FilterChain cannot be resolved. It is indirectly referenced from required .class files 

ce que je suis absent?

Répondre

3

@ explication de BalusC semble plus plausible que le mien ...

D'autres explications possibles/choses à vérifier:

  1. Le servlet-api.jar est pas dans $ CATALINA_HOME/lib, ou pour une raison quelconque ne contient pas la classe. (Je sais que vous avez dit que vous "savez" qu'il est là, mais vous n'avez pas spécifiquement dit que vous l'aviez vérifié.)

  2. Quelque chose d'autre est cassé qui a causé l'échec de la première tentative de chargement de HttpSessionListener avec une exception non interceptée pendant l'initialisation statique . (Ce genre est de peu plausible, puisque HttpSessionListener est une interface. Mais il convient de vérifier les journaux pour les erreurs de chargement des classes antérieures ... juste au cas où.)

  3. La classe manquante peut être nommé foo.bar.HttpSessionListener plutôt que javax.servlet.http.HttpSessionListener. Cela est susceptible d'apparaître dans la trace de la pile imbriquée. Si quelque chose dans le fichier WAR que vous déployez crée son propre classloader, il est possible qu'il le fasse de manière incorrecte et que la classe HttpSessionListener ne figure pas dans le classpath efficace du classloader.

EDIT

Si vous voyez maintenant des erreurs de compilation non résolues signalées dans les journaux, vous devez suspectez le fichier WAR et le processus utilisé pour le construire. Plus précisément, il semble que le WAR inclut des classes qui ont des erreurs de compilation Java!

(Ou peut-être cela est un problème ... mais la compilation des pages JSP qui se présenteraient dans les journaux aussi.)

+0

3 peuvent être exclus puisque les signaux d'erreur qu'il était dans classpath compiletime, mais pas dans le classpath runtime. 1 aurait entraîné des problèmes différents d'un simple 'NoClassDefFoundError'. Je ne suis pas sûr de 4, cela nécessiterait plus de connaissances du développeur et puisque cette erreur est assez triviale ... Option 2 est une belle, mais si je ne me trompe pas, cela aurait plutôt dû entraîner 'NoClassDefFoundError' de la l'implémentation de la classe d'écoute, pas l'interface. – BalusC

+0

wouldnt la construction de la fourmi ont enregistré quelques erreurs si les choses que je compilais avaient des problèmes? Je suppose que mal regarder dans les drapeaux verbeux pour le processus de construction d'abord – mkoryak

+0

@ mkoryak - oui, il aurait dû. Vérifiez ces journaux de construction. En outre, il peut être utile si vous avez inclus des stacktraces complets au lieu de seulement des messages d'erreur. Certains détails significatifs ne peuvent être déduits qu'à partir des chemins de pile complets. –

3

Comme par its javadoc cette classe a été introduite dans la version de l'API Servlet 2.3.

Si vous recevez cette erreur, il peut avoir essentiellement trois causes:

  1. Votre web.xml est déclarée Servlet 2.2 ou inférieur (ou incorrectement déclarés, Tomcat peut revenir à moins modus de compatibilité) . Puisque vous utilisez Java EE 5 et ainsi Servlet 2.5, le web.xml doit alors être déclarée comme comme:

    <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. Votre servletcontainer ne supporte pas Servlet 2.3 du tout et retombera au moins modus compatibilty. Mais ceci peut être exclu puisque Tomcat 6 devrait supporter Servlet 2.5.

  3. Vous avez en fait un autre fichier JAR API Servlet d'une ancienne version dans le classpath qui a la priorité dans la classe de chargement. Puisque vous avez déjà exclu WEB-INF/lib les prochains endroits à regarder seraient les dossiers JRE/lib et JRE/lib/ext.


Mise à jour: selon votre édition, FilterChain était also introduit dans la version 2.3 de l'API Servlet.

1 + 1 = ... :)

+0

merci pour votre réponse. Je me souviens des forums du soleil. ill vérifier vos suggestions - j'espère que quelque chose là aide. – mkoryak

1

java.lang.NoClassDefFoundError: javax/servlet/ServletContextListener pour cette NoClassDefFoundError sur HttpSessionListener, ServletListener, ServletContextListener, etc. peut être causée par un classloader personnalisé comme Sysdeo DevLoader (lors de l'utilisation avec Eclipse) dans votre définition de contexte dans le fichier server.xml de Tomcat.

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

là ..... insted de cette utilisation ...

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

et ajouter DevLoader.jar ur chemin de classe

Questions connexes