web-dev-qa-db-fra.com

java.lang.NoClassDefFoundError: javax/el/ELManager

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.

11
Jacek Ślimok

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

16
Jens

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>
1
Nandan kelkar

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 

1
Khan

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.

0
GabrielRado

Essayez ce qui suit:

  • Ajoutez javax.elet javax.el-api au pom.xml en tant qu'autre mention
  • Si 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 /

  • Ajouter une propriété à $ Java.home/lib/el.properties
  • Utiliser la propriété système avec le factoryId

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.

0
Terran

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.

0
Андрей Ким

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+).

0
CuriousRookie