Je dirige un projet Maven qui est également 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, le message suivant s'affiche:
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 qui devrait être fait dans mon cas.
Le fichier .jar de la servlet API ne doit pas être intégré à l'application Web, car il est évident que le conteneur contient déjà ces classes dans son chemin de classe: il implémente les interfaces contenues dans ce fichier jar.
La dépendance doit être dans la portée provided
, plutôt que par défaut compile
, dans votre pom Maven:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
Vous recevez ce message d'avertissement lorsque le fichier jar de servlet api a déjà été chargé dans le conteneur et que vous essayez de le charger à nouveau à partir du répertoire lib
.
Les spécifications de servlet indiquent que vous n'êtes pas autorisé à avoir le répertoire servlet.jar dans votre application Web
lib
.
servlet.jar
de votre répertoire lib
.lib
, recherchez votre chemin de génération et supprimez-le.C:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\project\WEB-INF\lib
Si vous exécutez un projet maven, remplacez la dépendance javax.servlet-api
par scope provided
dans pom.xml car le conteneur a déjà fourni le fichier jar de servlet lui-même.
Pour résoudre ce problème, définissez le scope sur fourni. Cela indique à Maven d'utiliser le code servlet-api.jar pour la compilation et le test uniquement, mais ne l'incluez PAS dans le fichier WAR. Le conteneur déployé "fournira" le servlet-api.jar lors de l'exécution.
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
La ligne de commande suivante de Windows peut vous être utile pour localiser le fichier JAR incriminé. il crée un index de tous les fichiers de classe dans tous les fichiers JAR du dossier. Exécutez-le depuis le dossier lib de votre application déployée, puis recherchez le fichier index.txt pour la classe incriminée.
for /r %X in (*.jar) do (echo %X & jar -tf %X) >> index.txt
étendue de la dépendance Maven
fourni : Cela ressemble beaucoup à la compilation, mais vous indique attendez le JDK ou un conteneur à fournir la dépendance à l'exécution. Par exemple, lors de la création d'une application Web pour Java Enterprise Edition, vous devez définir la dépendance sur l'API Servlet et les API Java EE associées à la portée fournie car le conteneur Web fournit ces classes. Cette portée est uniquement disponible sur le chemin de classe de compilation et de test et n'est pas transitive.
J'ai eu du mal avec ce problème et j'ai essayé de nombreuses "solutions".
Cependant, à la fin, le seul qui a fonctionné et qui a pris quelques secondes à faire était de: supprimer et rajouter une nouvelle instance de serveur!
En gros, j'ai cliqué avec le bouton droit de la souris 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.
Les exclusions et les dépendances provided
ne fonctionneront pas dans les projets enfants.
Si vous utilisez l'héritage dans les projets Maven, vous devez inclure cette configuration dans le fichier parent pom.xml
. Vous aurez une section <parent>...</parent>
dans votre pom.xml si vous utilisez l'héritage . Donc, vous aurez quelque chose comme ça dans votre parent 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>
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, dans ce répertoire de votre application Web WEB-INF\lib\el-api.jar le pot doit être enlevé
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 parce que Tomcat possède déjà une version intégrée de ce fichier jar, il ne l'utilisera donc pas. En règle générale, cela ne pose pas de problème.
Si cependant il est dit WEB-INF/lib/my_jar.jar - jar not loaded...Offending class: javax/servlet/Servlet.class
alors ce que vous pouvez faire (dans mon cas, c'est un pot ombré) est exécuté
Dépendance $ mvn: tree
et découvrez que vous avez une dépendance transitive sur "quelque chose" qui dépend d'un fichier jar qui est soit servlet-api ou quelque chose de ce type (ex: Tomcat-servlet-api-9.0.0
). Ajoutez donc à votre pom une exclusion, par exemple: (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>
lorsque votre modèle d'URL est incorrect, cette erreur peut se produire.
par exemple. Si vous avez écrit @WebServlet ("login"), cette erreur sera affichée. Le correct est @WebServlet ("/ login").
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 RI JAX-WS. Décompressez-le et copiez “jaxws-rt.jar” dans le dossier de la bibliothèque Tomcat “{$ Tomcat}/lib“. Redémarrez Tomcat.