web-dev-qa-db-fra.com

Erreur: Le fichier Jar du servlet n'est pas chargé ... Classe incriminée: javax/servlet/Servlet.class

Je reçois l'erreur suivante:

INFO: validateJarFile (C:\dev\serveur\Tomcat6\webapps Sempedia\WEB-INF\lib\servlet-api.jar) - jar non chargé. Voir Servlet Spec 2.3, sectoin 9.7.2. Classe en infraction: javax/servlet/Servlet.class

Les ressources existantes indiquent un conflit avec le fichier servlet.jar ou, dans mon cas, le fichier servlet-api.jar. J'ai supprimé tous les autres projets du dossier/webapps, j'ai pris le fichier servlet-api.jar qui se trouvait dans le répertoire Tomcat6/lib et ajouté cela uniquement au chemin de génération du projet, je ne vois donc pas comment est toujours un conflit.

Lorsque j'essaie d'exécuter l'application, la trace de pile suivante est obtenue.

org.Apache.jasper.JasperException: Impossible de compiler la classe pour JSP: 

Une erreur s'est produite à la ligne: 22 dans le fichier Java généré La méthode getJspApplicationContext (ServletContext) n'est pas définie pour le type JspFactory.

Trace de la pile:

org.Apache.jasper.compiler.DefaultErrorHandler.javacError (DefaultErrorHandler.Java:92) org.Apache.jasper.compiler.ErrorDispatcher.javacError (ErrorDispatcher.Java:330) org.Apache.jasper.compiler.JDTCompiler.generateClass (JDTCompiler.Java:439) org.Apache.jasper.compiler.Compiler.compile (Compiler.Java:334) org.Apache.jasper.compiler.Compiler.compile (Compiler.Java:312) org.Apache.jasper.compiler.Compiler.compile (Compiler.Java:299) org.Apache.jasper.JspCompilationContext.compile (JspCompilationContext.Java:586) org.Apache.jasper.servlet.JspServletWrapper.service (JspServletWrapper.Java:317) org.Apache.jasper.servlet.JspServlet.serviceJspFile (JspServlet.Java:342) org.Apache.jasper.servlet.JspServlet.service (JspServlet.Java:267) javax.servlet.http.HttpServlet.service (HttpServlet.Java:717)

30
Ankur

Comme d'autres réponses le disent, c'est parce que votre fichier WAR inclut les classes d'API servlet, mais il ne devrait pas le faire.

Si vous utilisez Maven pour construire votre projet, vous voudrez probablement lui demander de rendre l'API de servlet disponible lors de la compilation et du test, mais de ne pas l'inclure dans le fichier WAR. Comme le dit la documentation Maven sur la portée de dépendance , vous devez utiliser la portée provided pour l'API Servlet:

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

Vous devrez peut-être également exclure explicitement l'API Servlet en tant que dépendance transitive, si certaines de vos dépendances extraient l'API Servlet en tant que dépendance de compilation:

    <dependency>
        <groupId>com.example</groupId>
        <artifactId>frob-driver-core</artifactId>
        <version>1.0.1</version>
        <exclusions>
            <exclusion>
                <artifactId>servlet-api</artifactId>
                <groupId>javax.servlet</groupId>
            </exclusion>
        </exclusions>
    </dependency>
20
Raedwald

Vous n'êtes pas autorisé à déployer des classes qui remplacent celles définies dans la spécification de servlet à fournir par le conteneur Web. Vous pouvez télécharger la spécification de

http://www.jcp.org/aboutJava/communityprocess/final/jsr053/

et vérifiez par vous-même. La section 9.7.2 se trouve à la page physique 63.

Servlet 2.3 est une version plutôt ancienne indiquant une version ancienne de Tomcat. Y a-t-il une raison particulière pour laquelle vous n'en utilisez pas un plus récent?

Le premier message d'erreur que vous avez reçu est dû au fait que Tomcat n'a pas besoin de charger le fichier jar de servlet car il en a déjà un et souhaite éviter les conflits.

Vous pouvez généralement ignorer l'avertissement en toute sécurité. Si vous ne souhaitez pas qu'il apparaisse, vous devez déplacer le fichier jar servlet de votre projet, plutôt que celui de Tomcat. En prenant Tomcat et en l'introduisant dans votre projet, vous avez réussi à le convaincre de le charger depuis votre application Web plutôt que depuis l'endroit où il l'attendait, ce qui a provoqué un problème de chargeur de classe, comme indiqué dans la réponse de BalusC.

Éditer: Ce qui précède a été édité pour clarifier ce qui se passait une fois que vous avez mis le servlet-api jar de Tomcat dans votre application Web (et attribuez BalusC). 

2
Jamie McCrindle

En fait, j'ai eu une telle erreur et application. n'a pas pu démarrer car, pour une raison quelconque, certains des fichiers jar dans WEB-INF/lib avaient l'extension.JAR(majuscule) au lieu de .jar. Donc, assurez-vous que tous les pots sont valides. 

1
sergeyan

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 pom.xml parent. Vous aurez une section <parent>...</parent> dans votre pom.xml si vous utilisez un héritage . Donc, vous aurez quelque chose comme ceci 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>
0
lmiguelmh