pot non chargé. Voir Servlet Spec 2.3, section 9.7.2. Classe incriminée: javax / servlet / Servlet.class


100

Je dirige un projet Maven qui est aussi un projet web dynamique. J'ai utilisé toutes les bibliothèques Spring dans Maven. J'ai créé web.xml, mais lorsque je démarre mon serveur Tomcat 7, je reçois le message suivant:

INFO: validateJarFile(C:\Users\mibvzd0\workspace\.metadata\.plugins\
org.eclipse.wst.server.core\tmp2\wtpwebapps\hapi_hl7\WEB-INF\lib\
servlet-api-2.4.jar) - jar not loaded.
See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class

J'ai essayé de supprimer le servlet de webapp/lib, mais cela n'a pas fonctionné. Faites-moi savoir ce qu'il faut faire dans mon cas.


Notez que ce comportement est conforme à la spécification du servlet. Une compréhension complète est utile pour comprendre les problèmes les plus délicats que vous pourriez rencontrer.
Thorbjørn Ravn Andersen

Réponses:


113

Le fichier .jar de l'API servlet ne doit pas être intégré à la webapp car, évidemment, le conteneur a déjà ces classes dans son classpath: il implémente les interfaces contenues dans ce jar.

La dépendance doit être dans la providedportée, plutôt que dans la compileportée par défaut , dans votre pom Maven:

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
</dependency>

"La dépendance doit être dans la portée fournie, plutôt que dans la portée de compilation par défaut, dans votre pom Maven." Comment puis-je faire cela
dreambigcoder

Voir ma réponse modifiée. nettoyez et construisez l'application à l'aide de Maven, et vérifiez que le fichier jar du servlet ne se trouve pas dans le répertoire WEB-INF / lib de l'application Web générée.
JB Nizet

J'ai tout fait. pourtant je trouve le jar dans le répertoire WEB-INF / lib. Si je supprime le fichier jar que je reçois ci-dessous, le message INFO: Démarrage du moteur de servlet: Apache Tomcat / 7.0.12 Dois-je faire quelque chose?
dreambigcoder

6
Peut-être avez-vous une dépendance qui a une dépendance transitive à une autre version jar de servlet. Utilisez mvn dependency: tree pour trouver d'où vient ce fichier jar de servlet et ajoutez une exclusion.
JB Nizet

comment faire de même pour le lierre?
Dinesh Babu KG

21

Vous obtenez ce message d'avertissement lorsque le fichier jar de l'api du servlet a déjà été chargé dans le conteneur et que vous essayez de le charger à nouveau à partir du librépertoire.

Les spécifications du servlet indiquent que vous n'êtes pas autorisé à avoir servlet.jar dans votre librépertoire webapps .

  • Débarrassez-vous du message d'avertissement en le supprimant simplement servlet.jarde votre librépertoire.
  • Si vous ne trouvez pas le fichier jar dans le librépertoire, recherchez le chemin de compilation et supprimez le fichier jar.

C:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\project\WEB-INF\lib

Si vous exécutez un projet maven, modifiez la javax.servlet-apidépendance en portée provideddans votre pom.xml car le conteneur a déjà fourni le fichier jar de servlet en lui-même.


4

Pour résoudre ce problème, définissez la portée sur fourni . Cela indique à Maven d'utiliser le code servlet-api.jar uniquement pour la compilation et le test, mais de NE PAS l'inclure dans le fichier WAR. Le conteneur déployé «fournira» le servlet-api.jar au moment de l'exécution.

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>2.5</version>
    <scope>provided</scope>
</dependency>

2

Vous pouvez trouver la ligne de commande Windows suivante utile pour rechercher le fichier jar incriminé. il crée un index de tous les fichiers de classe dans tous les jars du dossier. Exécutez à partir du dossier lib de votre application déployée, puis recherchez dans le fichier index.txt la classe incriminée.

for /r %X in (*.jar) do (echo %X & jar -tf %X) >> index.txt

2

Périmètre de dépendance Maven

fourni : Cela ressemble beaucoup à la compilation, mais indique que vous vous attendez à ce que le JDK ou un conteneur fournisse la dépendance au moment de l'exécution. Par exemple, lors de la création d'une application Web pour Java Enterprise Edition, vous définissez la dépendance sur l' API Servlet et les API Java EE associées sur l'étendue fournie car le conteneur Web fournit ces classes . Cette portée n'est disponible que sur le chemin de classe de compilation et de test, et n'est pas transitive.


1

J'ai été aux prises avec ce problème et j'ai essayé de nombreuses «solutions».

Cependant, à la fin, le seul qui a fonctionné et il a fallu quelques secondes pour le faire était de: supprimer et rajouter une nouvelle instance de serveur !

En gros, j'ai fait un clic droit sur mon serveur Tomcat dans Eclipse sous Serveurs et je l'ai supprimé. Ensuite, j'ai ajouté un nouveau serveur Tomcat. Nettoyé et redéployé l'application et je me suis débarrassé de cette erreur.


Faites un clic droit sur votre serveur -> Nettoyer ... puis cliquez à nouveau avec le bouton droit sur votre serveur -> nettoyer le répertoire de travail de tomcat l'a corrigé pour moi
kiltek

0

Recherchez dans le répertoire suivant le fichier jar el-api.jar: C: \ apache-tomcat-7.0.39 \ lib \ el-api.jar s'il existe alors dans ce répertoire de votre application Web WEB-INF \ lib \ el-api.jar le pot doit être retiré


0

lorsque votre modèle d'URL est incorrect, cette erreur peut se produire.

par exemple. Si vous avez écrit @WebServlet ("login"), cette erreur s'affichera. Le bon est @WebServlet ("/ login").


0

Les exclusions et provideddépendances ne fonctionneront pas dans les projets enfants.

Si vous utilisez l'héritage dans des projets Maven, vous devez inclure cette configuration dans le pom.xmlfichier parent . Vous aurez une <parent>...</parent>section dans votre pom.xml si vous utilisez l'héritage . Donc, vous aurez quelque chose comme ça chez vos parents pom.xml:

<groupId>some.groupId</groupId>
<version>1.0</version>
<artifactId>someArtifactId</artifactId>
<packaging>pom</packaging>
<modules>
    <module>child-module-1</module>
    <module>child-module-2</module>
</modules>
<dependencies>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>2.5</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>javax.servlet.jsp</groupId>
        <artifactId>jsp-api</artifactId>
        <version>2.1</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

0

La bibliothèque de dépendances JAX-WS «jaxws-rt.jar» est manquante.

Allez ici http://jax-ws.java.net/ . Téléchargez la distribution JAX-WS RI. Décompressez-le et copiez «jaxws-rt.jar» dans le dossier de la bibliothèque Tomcat «{$ TOMCAT} / lib». Redémarrez Tomcat.


0

Généralement, lorsque vous voyez ce message, il est bénin. Si ça dit

INFO: validateJarFile(/<webapp>/WEB-INF/lib/servlet-api-2.5.jar) - jar not loaded. 
See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class

Cela signifie qu'il ignore votre servlet-api-2.5.jar car tomcat a déjà une version intégrée de ce fichier jar, il n'utilisera donc pas la vôtre. En règle générale, cela ne pose pas de problème.

Si cependant il dit WEB-INF/lib/my_jar.jar - jar not loaded...Offending class: javax/servlet/Servlet.class

puis ce que vous pouvez faire (dans mon cas, c'est un pot ombré) est exécuté

Dépendance $ mvn: arbre

et découvrez que vous avez une dépendance transitive sur "quelque chose" qui dépend d'un jar qui est soit servlet-api ou quelque chose comme ça (ex:) tomcat-servlet-api-9.0.0. Alors ajoutez une exclusion à cela à votre pom, ex: (dans mon cas, tomcat, dans votre cas, probablement ceux mentionnés dans les autres réponses):

 <dependency>
    ...
    <exclusions>
      <exclusion>
        <groupId>org.apache.tomcat</groupId>
        <artifactId>tomcat-servlet</artifactId>
      </exclusion>
    </exclusions> 
</dependency>

-4

Supprimer servlet.jardu web-inf/libdossier source car il est disponible dans le libdossier tomcat puis cela fonctionne bien


1
Cette réponse n'ajoute rien qui ne soit pas déjà dans cette réponse .
Glorfindel
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.