Lorsque j'essaie d'exécuter ma webapp sur Tomcat 7, j'ai eu l'exception suivante:
exception
javax.servlet.ServletException: Java.lang.LinkageError: loader constraint violation: when resolving interface method "javax.servlet.jsp.JspApplicationContext.getExpressionFactory()Ljavax/el/ExpressionFactory;
" the class loader (instance of org/Apache/jasper/servlet/JasperLoader) of the current class, org/Apache/jsp/index_jsp, and the class loader (instance of org/Apache/catalina/loader/StandardClassLoader) for resolved class, javax/servlet/jsp/JspApplicationContext,
have different Class objects for the type javax/el/ExpressionFactory used in the signature
org.Apache.jasper.servlet.JspServlet.service(JspServlet.Java:343)
javax.servlet.http.HttpServlet.service(HttpServlet.Java:722)
root cause
Java.lang.LinkageError: loader constraint violation: when resolving interface method "javax.servlet.jsp.JspApplicationContext.getExpressionFactory()Ljavax/el/ExpressionFactory;" the class loader (instance of org/Apache/jasper/servlet/JasperLoader) of the current class, org/Apache/jsp/index_jsp, and the class loader (instance of org/Apache/catalina/loader/StandardClassLoader) for resolved class, javax/servlet/jsp/JspApplicationContext, have different Class objects for the type javax/el/ExpressionFactory used in the signature
org.Apache.jsp.index_jsp._jspInit(index_jsp.Java:31)
org.Apache.jasper.runtime.HttpJspBase.init(HttpJspBase.Java:49)
org.Apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.Java:180)
org.Apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.Java:369)
org.Apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.Java:390)
org.Apache.jasper.servlet.JspServlet.service(JspServlet.Java:334)
javax.servlet.http.HttpServlet.service(HttpServlet.Java:722)
Il semble qu'il y ait un conflit entre deux .jar
librairies, mais je ne sais pas de quoi il s'agit. Comment puis-je les comprendre et les résoudre?
Cela se produit lorsque vous incluez des bibliothèques spécifiques au serveur d'une autre marque/version de serveur dans le /WEB-INF/lib
de votre application Web, comme jsp-api.jar
, el-api.jar
, servlet-api.jar
, etc. Vous devez les supprimer tous. Le /WEB-INF/lib
ne doit contenir aucune bibliothèque spécifique au serveur. Ils appartiennent au serveur spécifique lui-même (Tomcat les a dans son /lib
dossier déjà).
C'est d'ailleurs une erreur assez courante pour les débutants chaque fois qu'ils rencontrent des erreurs de compilation sur l'API JSP/Servlet dans leur projet IDE. Cela aurait dû être résolu différemment, à savoir en intégrant le serveur dans le = IDE et ajout du serveur en tant que "Runtime cible" au projet.
Vous avez deux options pour ajouter à vos bibliothèques de projets, telles que jsp-api.jar
, el-api.jar
, servlet-api.jar
, etc:
Java Build Path
;provided
pour chacune d'entre elles, par exemple:<dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.1</version> <scope>provided</scope> </dependency>
Consultez cette page
http://www.jarfinder.com/index.php/Java/info/org.Apache.jasper.runtime.HttpJspBase
Trouvez les pots que vous avez utilisés pour cela. Retirez-en un si vous en trouvez deux. :)
J'ai été coincé avec cette erreur pendant très longtemps et ce fil a sauvé pas mal de mon temps. Ajout de quelques recherches que j'ai faites avant de résoudre ce problème. Oui, nous devons supprimer des bibliothèques comme jsp-api.jar, el-api.jar, servlet-api.jar
de /WEB-INF/lib
dossier. Mais comment?
Dans mon cas, j'utilise Apache Ivy comme gestionnaire de dépendances et j'ai utilisé Spring MVC. Il télécharge toutes les dépendances ainsi que les bibliothèques mentionnées ci-dessus. Au moment de l'exécution, ces conflits avec les API fournies par les bibliothèques Tomcat. Une solution simple serait d'exclure ces fichiers jar des dépendances ou de créer des configurations et d'inclure ces bibliothèques dans la configuration de compilation uniquement. Ce qui a fonctionné rapidement pour moi, c'est d'exclure ces bibliothèques.
<dependency org="org.springframework" name="spring-webmvc"
rev="4.0.4.RELEASE">
<exclude org="javax.servlet" name="javax.servlet-api" />
<exclude org="javax.servlet.jsp" name="jsp-api" />
<exclude org="javax.el" name="javax.el-api" />
</dependency>
Dans mon cas, j'avais la dépendance Tomcat ainsi que le plugin Tomcat mentionné dans le POM. Suppression de la dépendance en ne laissant que le plugin et cela a fonctionné.
C'est bizarre ERREUR que j'ai jamais eu
Après la recherche, j'ai trouvé ces causes et cette solution
J'utilise Spring donc dans mes bibliothèques @spring j'ai déjà le pot comme
Servlet-api.jar
ou javax-servlet-api.jar
jsp-api.jar
ou javax-servlet-jsp.jar
Mais ce n'est pas compatible avec mon serveur Tomcat Donc, simplement je supprime ces deux pots de mon chemin de montage et de mon assemblage de déploiement. et ajouter ces deux pots à mon projet
servlet-api.jar
jsp-api.jar