Je travaille sur une application Web dans Spring à l'aide de Spring Tool Suite. Si je construis et déploie l'application à l'aide de IDE sur le serveur Pivotal tc fourni, cela fonctionne parfaitement. Cependant, si je crée manuellement un "paquet propre mvn" et que je tente de le déployer sur un serveur Tomcat autonome (à l'aide du dernier Tomcat 7), l'exception suivante est générée:
2017-08-23 15:24:13 WARN AnnotationConfigWebApplicationContext:551 - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'requestMappingHandlerAdapter' defined in org.springframework.web.servlet.config.annotation.DelegatingWebMvcConfiguration: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter]: Factory method 'requestMappingHandlerAdapter' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mvcValidator' defined in org.springframework.web.servlet.config.annotation.DelegatingWebMvcConfiguration: Invocation of init method failed; nested exception is Java.lang.NoClassDefFoundError: javax/el/ELManager
2017-08-23 15:24:13 ERROR DispatcherServlet:502 - Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'requestMappingHandlerAdapter' defined in org.springframework.web.servlet.config.annotation.DelegatingWebMvcConfiguration: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter]: Factory method 'requestMappingHandlerAdapter' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mvcValidator' defined in org.springframework.web.servlet.config.annotation.DelegatingWebMvcConfiguration: Invocation of init method failed; nested exception is Java.lang.NoClassDefFoundError: javax/el/ELManager
Après une inspection plus poussée, quelques lignes plus haut se plaignent de ne pas charger les bocaux:
sie 23, 2017 3:24:12 PM org.Apache.catalina.startup.HostConfig deployWAR
INFO: Deploying web application archive D:\Apache-Tomcat-7.0\webapps\TestApp-0.0.1-SNAPSHOT.war
sie 23, 2017 3:24:12 PM org.Apache.catalina.loader.WebappClassLoader validateJarFile
INFO: validateJarFile(D:\Apache-Tomcat-7.0\webapps\TestApp-0.0.1-SNAPSHOT\WEB-INF\lib\el-api-2.2.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/el/Expression.class
sie 23, 2017 3:24:12 PM org.Apache.catalina.loader.WebappClassLoader validateJarFile
INFO: validateJarFile(D:\Apache-Tomcat-7.0\webapps\TestApp-0.0.1-SNAPSHOT\WEB-INF\lib\javax.servlet-api-3.1.0.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class
sie 23, 2017 3:24:12 PM org.Apache.catalina.loader.WebappClassLoader validateJarFile
INFO: validateJarFile(D:\Apache-Tomcat-7.0\webapps\TestApp-0.0.1-SNAPSHOT\WEB-INF\lib\Tomcat-el-api-8.0.21.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/el/Expression.class
2017-08-23 15:24:13 INFO ContextLoader:304 - Root WebApplicationContext: initialization started
Mon pom.xml:
<project xmlns="http://maven.Apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.Apache.org/POM/4.0.0 http://maven.Apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.exmaple.mvc</groupId>
<artifactId>TestApp</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.10.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.10.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.3.10.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.3.10.RELEASE</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.6</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
<exclusions>
<exclusion>
<artifactId>jms</artifactId>
<groupId>javax.jms</groupId>
</exclusion>
<exclusion>
<artifactId>jmxri</artifactId>
<groupId>com.Sun.jmx</groupId>
</exclusion>
<exclusion>
<artifactId>jmxtools</artifactId>
<groupId>com.Sun.jdmk</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mockito/mockito-all -->
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>1.9.5</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-lang/commons-lang -->
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-validator -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.1.Final</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
Quelle est la raison de ce comportement et comment puis-je résoudre ce problème?
EDITPlus d'informations:
L'ajout de <scope>provided</scope>
à javax.servlet-api
semble résoudre l'avertissement selon lequel javax.servlet-api
n'est pas chargé au début. Le problème avec el-api
reste toujours.
J'ai vérifié le répertoire Tomcat/lib et il contient déjà el-api.jar
, ce qui explique probablement pourquoi il me dit qu'il ne va pas charger celui que je liste dans pom.xml. Le fait est que l'ajout de <scope>provided</scope>
ne résout pas le problème non plus. Quoi que je fasse, il se plaint toujours de me donner la même erreur Java.lang.NoClassDefFoundError: javax/el/ELManager
.
SOLUTION
En plus de la partie de l'édition ci-dessus concernant javax.servlet-api
, le problème avec el-api
était que j'utilisais un Tomcat 7 avec le fichier jar el-api
fourni dans la version 2.2. La classe manquante a été introduite dans el-api 3.0. L'exécution de la même application Web dans Tomcat 8 (avec el-api 3.0 jar) fonctionne correctement.
Vous manquez le javax.el-api
en tant que dépendance. Ajouter:
<dependency>
<groupId>javax.el</groupId>
<artifactId>javax.el-api</artifactId>
<version>3.0.0</version>
</dependency>
à votre pom.xml
Veuillez vous référer à Erreur "Impossible d’initialiser javax.el.ExpressionFactory" pour la validation Hibernate
utilisation
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.el</artifactId>
<version>3.0.1-b08</version>
</dependency>
Dans mon cas, .__ a commenté cette dépendance,
<!-- <dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.8.Final</version>
</dependency> -->
et ajouté
<dependency>
<groupId>javax.el</groupId>
<artifactId>javax.el-api</artifactId>
<version>3.0.0</version>
<scope>provided</scope>
</dependency>
Cela a résolu mon problème
J'utilise Tomcat 7.0.9 et je ne pouvais pas en remplacer un plus récent en raison de la bureaucratie de mon entreprise. Importer EL en tant que dépendance ne l’a pas résolu non plus.
Dans le dossier racine de Tomcat -> lib, j'ai remplacé old el-api (version 2.2 de celui-ci) par un nouveau 3.0 (à partir du .m2\repository\javax\el\javax.el-api\3.0.0
local). Ensuite, en isolant correctement les dépendances de Tomcat (comme indiqué ici ), mon fichier WAR était correctement déployé sur Tomcat 7.0.9.
Essayez ce qui suit:
javax.el
et javax.el-api
au pom.xml en tant qu'autre mentionSi vous avez différents chargeurs de classe - comme c'est souvent le cas lorsque vous utilisez OSGi - vous devez définir temporairement le contexte sur celui qui détient l'implémentation. Terminez votre appel avec:
ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader();
try {
Class<?> currentClass = this.getClass(); // or any class that is in a bundle with the dependency
Thread.currentThread().setContextClassLoader(currentClass.getClassLoader());
// execute library call
} finally {
Thread.currentThread().setContextClassLoader(originalClassLoader); // back to original context
}
Ajouter un service à META-INF/services /
Lorsque la bibliothèque instancie la ExpressionFactory
via> ELManager.newInstance(..)
> FactoryFinder.find(..)
, elle dispose de plusieurs stratégies pour trouver une implémentation. L'appel est codé en dur comme ceci:
public static ExpressionFactory newInstance(Properties properties) {
return (ExpressionFactory) FactoryFinder.find(
"javax.el.ExpressionFactory", "com.Sun.el.ExpressionFactoryImpl", properties);
}
Voir la source de javax.el.FactoryFinder.find(..)
pour plus d'informations.
Rétrograder hibernate-validator vers la version 5 et cela fonctionnera bien avec Tomcat 7 . Dans mon cas, j'ajoute la dépendance suivante à mon pom:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.4.3.Final</version>
</dependency>
Ou vous pouvez ajouter un nouveau fichier el-api.jat au dossier Tomcat lib.
Hibernate Validator 6.x -> Validation de beans 2.0 (JSR 380) -> EL3.0
Hibernate Validator 5.x -> Bean Validation 1.1 (JSR 349) -> EL2.2
Bean Validation 1.0 (JSR 303) -> (Je ne suis pas sûr)
oui, cela influence aussi la version des autres (Tomcat, jdk, jsp, servlet)
tels que Tomcat7, si vous souhaitez utiliser Hibernate Validator, utilisez Hibernate Validator 5.x, el 2.2 (et servlet 3.0, jsp 2.2 et jdk 6+).