Je souhaite déployer mon application sur un Tomcat dans la version 7 et j'obtiens l'exception suivante Java.lang.NoClassDefFoundError: javax/el/ELManager
Mais si j'essaie de déployer cette application sur Tomcat version 8, cela fonctionne très bien.
Avez-vous des idées pour résoudre ce problème?
Pourquoi dois-je passer de Tomcat 8 à 7? Dans l'environnement de test, il y avait Tomcat 8 dans le référentiel et sur le serveur, c'est Tomcat7.
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>certplatform</groupId>
<artifactId>certplatform</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<build>
<sourceDirectory>src</sourceDirectory>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<warSourceDirectory>WebContent</warSourceDirectory>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-
core -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.0.4.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-
context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.4.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-
context-support -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>5.0.4.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-
webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.0.4.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-web
-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.0.4.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet/jstl -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!--https://mvnrepository.com/artifact/javax.servlet.jsp.jstl/javax.servlet.jsp.jstl-api -->
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>javax.servlet.jsp.jstl-api</artifactId>
<version>1.2.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.mail/mail -->
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.5.0-b01</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-validator -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.8.Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.2.15.Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-entitymanager -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.2.15.Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.postgresql/postgresql -->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.2.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk15on -->
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.59</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.bouncycastle/bcpkix-jdk15on -->
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcpkix-jdk15on</artifactId>
<version>1.59</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.el/javax.el-api -->
<dependency>
<groupId>javax.el</groupId>
<artifactId>javax.el-api</artifactId>
<version>3.0.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.el/el-api -->
<dependency>
<groupId>javax.el</groupId>
<artifactId>el-api</artifactId>
<version>2.2</version>
</dependency>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
id="WebApp_ID" version="3.1">
<display-name>spring-mvc-demo</display-name>
<!-- Spring MVC Configs -->
<!-- Step 1: Configure Spring MVC Dispatcher Servlet -->
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring-mvc-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- Step 2: Set up URL mapping for Spring MVC Dispatcher Servlet -->
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
Le problème est dû au fait que cette classe javax/el/ELManager
est introduit dans el-api
version 3.0.
Tomcat 7 est livré avec el-api 2.2 pré-fourni (qui manque la classe) et il le choisit au moment de l'exécution, au lieu de votre pot el-api.
Tomcat 8 a le el-api 3. et donc le javax/el/ELManager
la classe est présente.
Il est préférable de synchroniser vos environnements de développement/test/prod le plus près possible.
Il est beaucoup plus logique de développer contre Tomcat 8 en dev, lorsque votre environnement de test a Tomcat 8. Comme vous l'avez découvert, les serveurs Tomcat 7 et 8 sont livrés avec un ensemble de bibliothèques différent, de sorte que votre code peut se comporter différemment par rapport à ces différents ensembles de bibliothèques.
Si vous souhaitez exécuter votre application Web sur Tomcat 7 en production, vous devez utiliser Tomcat 7 dans votre environnement de test.
Ce qui s'est passé, c'est que vous avez accidentellement introduit une dépendance sur les API EL 3.0 ... et que vous l'avez incluse dans votre fichier POM. Cela fonctionne trouver sur Tomcat 8. Mais sur Tomcat 7, la plate-forme prend en charge EL 2.1. Ainsi, lorsque votre application tente de charger le fichier de classe pour javax.el.ELManager
... il échoue.
Solutions:
La page Versions Apache Tomcat répertorie les différentes versions de spécifications pour chacune des versions principales de Tomcat.
N'y a-t-il aucune possibilité de résoudre ce problème?
Si vous étiez prêt à "massacrer" le serveur Tomcat 7, vous pourrez peut-être remplacer l'implémentation EL par une plus récente. Mais je n'essaierais pas cela, car 1) cela peut ne pas fonctionner du tout, et 2) le résultat est susceptible d'être difficile à maintenir. Et vous êtes susceptible de donner une apoplexie à vos équipes d'exploitation, d'assurance qualité et/ou de sécurité!
N'y a-t-il aucune possibilité de résoudre ce problème en modifiant l'application?
Sûr. Changez votre POM pour vous en débarrasser:
<!-- https://mvnrepository.com/artifact/javax.el/javax.el-api -->
<dependency>
<groupId>javax.el</groupId>
<artifactId>javax.el-api</artifactId>
<version>3.0.0</version>
</dependency>
supprimez toutes vos dépendances de code sur les API EL 3.0, compilez, testez sur Tomcat 7 et ...
Mais si ce n'est pas votre code mais d'autres bibliothèques qui dépendent d'EL 3.0, cela peut ne pas être viable.