web-dev-qa-db-fra.com

Tomcat 7 Java.lang.NoClassDefFoundError: javax / el / ELManager

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>
9
Mister Lamp

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.

8
hovanessyan

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:

  • Mettez à niveau votre plateforme de production vers Tomcat 8
  • Testez contre Tomcat 7 et éliminez toutes les dépendances de votre base de code sur les API plus récentes.

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.

3
Stephen C