java.lang.NoClassDefFoundError: javax/el/ELManager
java.lang.NoClassDefFoundError: javax/el/ELManager
我正在使用 Spring Tool Suite 在 Spring 中开发一个网络应用程序。如果我使用 IDE 构建应用程序并将其部署到提供的 Pivotal tc 服务器上,它就可以正常工作。但是,如果我进行手动 "mvn clean package" 构建并尝试将其部署到独立的 Tomcat 服务器(使用最新的 Tomcat 7),它会抛出以下异常:
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
经过进一步检查,它确实抱怨上面几行关于没有加载罐子:
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
我的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>
出现这种行为的原因是什么?我该如何解决?
编辑更多信息:
将 <scope>provided</scope>
添加到 javax.servlet-api
似乎修复了关于 javax.servlet-api
未在开始时加载的警告。 el-api
的问题仍然存在。
我已经检查了 tomcat/lib 目录,它已经包含 el-api.jar
,这可能就是为什么它告诉我它不会加载我在 pom.xml 中列出的目录的原因.问题是,添加 <scope>provided</scope>
也不能解决问题。无论我做什么,它仍然抱怨给我同样的 java.lang.NoClassDefFoundError: javax/el/ELManager
错误。
解决方案
除了上面关于 javax.servlet-api
的编辑部分之外,el-api
的问题是我 运行 一个 Tomcat 7 提供 el-api
版本 2.2 中的 jar。缺失的 class 是在 el-api 3.0 中引入的。 运行 Tomcat 8 中的相同 webapp(使用 el-api 3.0 jar)工作正常。
您错过了 javax.el-api
作为依赖项。添加:
<dependency>
<groupId>javax.el</groupId>
<artifactId>javax.el-api</artifactId>
<version>3.0.0</version>
</dependency>
给你的pom.xml
请参考
使用
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.el</artifactId>
<version>3.0.1-b08</version>
</dependency>
就我而言,
注释掉这个依赖,
<!-- <dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.8.Final</version>
</dependency> -->
并添加了
<dependency>
<groupId>javax.el</groupId>
<artifactId>javax.el-api</artifactId>
<version>3.0.0</version>
<scope>provided</scope>
</dependency>
这解决了我的问题
尝试以下操作:
- 将
javax.el
和 javax.el-api
添加到 pom.xml 和其他 mention
如果您有不同的类加载器(使用 OSGi 时经常出现这种情况),您需要临时将上下文设置为保存实现的那个。用以下方式结束您的通话:
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
}
添加服务到META-INF/services/
- 添加一个属性到$java.home/lib/el.properties
- 使用系统 属性 和 factoryId
当库通过 > ELManager.newInstance(..)
> FactoryFinder.find(..)
实例化 ExpressionFactory
时,它有几种策略来查找实现。调用是这样硬编码的:
public static ExpressionFactory newInstance(Properties properties) {
return (ExpressionFactory) FactoryFinder.find(
"javax.el.ExpressionFactory", "com.sun.el.ExpressionFactoryImpl", properties);
}
有关详细信息,请参阅 javax.el.FactoryFinder.find(..)
的来源
我正在使用 Tomcat 7.0.9,由于我公司的官僚作风,无法更改为任何更新的版本。导入EL作为依赖也没有解决。
在 Tomcat 的根文件夹 -> lib 中,我用新的 3.0(来自本地 .m2\repository\javax\el\javax.el-api.0.0
)替换了旧的 el-api(它的 2.2 版本)。然后,正确隔离 tomcat 的依赖项(如图 here 所示)使我的 WAR 正确部署在 Tomcat 7.0.9
Hibernate 验证器 6.x -> Bean 验证 2.0 (JSR 380) -> EL3.0
Hibernate 验证器 5.x -> Bean 验证 1.1 (JSR 349) -> EL2.2
Bean 验证 1.0 (JSR 303) ->(我不确定)
所以,它也影响其他版本(tomcat,jdk,jsp,servlet)
如tomcat7、如果要使用Hibernate Validator,应该使用Hibernate Validator 5.x、el 2.2(和servlet 3.0、jsp 2.2和jdk 6+)
将 hibernate-validator 降级到版本 5,它将与 Tomcat 7 一起正常工作。
在我的例子中,我将下一个依赖项添加到我的 pom:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.4.3.Final</version>
</dependency>
或者您可以将更新的 el-api.jat 添加到 tomcat lib 文件夹。
为 Tomcat 7 的人添加我的答案并尝试应用所选答案。
如果添加依赖项对您没有帮助并且您继续获取
java.lang.NoClassDefFoundError: javax/el/ELManager
那是因为 Tomcat 7 不允许您使用 javax.*
包中的对象加载更现代的 jar。它将打印到日志:
jakarta.el-3.0.3.jar - jar not loaded. See Servlet Spec 3.0, section 10.7.2. Offending class: javax/el/Expression.class
解决方案是升级您的 Tomcat 或将 hibernate-validator 降级到最新的 5.x 版本。另一个(我的 POV 不太喜欢)选项是尝试替换 tomcat7/lib 文件夹中的罐子。
我正在使用 Spring Tool Suite 在 Spring 中开发一个网络应用程序。如果我使用 IDE 构建应用程序并将其部署到提供的 Pivotal tc 服务器上,它就可以正常工作。但是,如果我进行手动 "mvn clean package" 构建并尝试将其部署到独立的 Tomcat 服务器(使用最新的 Tomcat 7),它会抛出以下异常:
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
经过进一步检查,它确实抱怨上面几行关于没有加载罐子:
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
我的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>
出现这种行为的原因是什么?我该如何解决?
编辑更多信息:
将 <scope>provided</scope>
添加到 javax.servlet-api
似乎修复了关于 javax.servlet-api
未在开始时加载的警告。 el-api
的问题仍然存在。
我已经检查了 tomcat/lib 目录,它已经包含 el-api.jar
,这可能就是为什么它告诉我它不会加载我在 pom.xml 中列出的目录的原因.问题是,添加 <scope>provided</scope>
也不能解决问题。无论我做什么,它仍然抱怨给我同样的 java.lang.NoClassDefFoundError: javax/el/ELManager
错误。
解决方案
除了上面关于 javax.servlet-api
的编辑部分之外,el-api
的问题是我 运行 一个 Tomcat 7 提供 el-api
版本 2.2 中的 jar。缺失的 class 是在 el-api 3.0 中引入的。 运行 Tomcat 8 中的相同 webapp(使用 el-api 3.0 jar)工作正常。
您错过了 javax.el-api
作为依赖项。添加:
<dependency>
<groupId>javax.el</groupId>
<artifactId>javax.el-api</artifactId>
<version>3.0.0</version>
</dependency>
给你的pom.xml
请参考
使用
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.el</artifactId>
<version>3.0.1-b08</version>
</dependency>
就我而言, 注释掉这个依赖,
<!-- <dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.8.Final</version>
</dependency> -->
并添加了
<dependency>
<groupId>javax.el</groupId>
<artifactId>javax.el-api</artifactId>
<version>3.0.0</version>
<scope>provided</scope>
</dependency>
这解决了我的问题
尝试以下操作:
- 将
javax.el
和javax.el-api
添加到 pom.xml 和其他 mention 如果您有不同的类加载器(使用 OSGi 时经常出现这种情况),您需要临时将上下文设置为保存实现的那个。用以下方式结束您的通话:
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 }
添加服务到META-INF/services/
- 添加一个属性到$java.home/lib/el.properties
- 使用系统 属性 和 factoryId
当库通过 > ELManager.newInstance(..)
> FactoryFinder.find(..)
实例化 ExpressionFactory
时,它有几种策略来查找实现。调用是这样硬编码的:
public static ExpressionFactory newInstance(Properties properties) {
return (ExpressionFactory) FactoryFinder.find(
"javax.el.ExpressionFactory", "com.sun.el.ExpressionFactoryImpl", properties);
}
有关详细信息,请参阅 javax.el.FactoryFinder.find(..)
的来源
我正在使用 Tomcat 7.0.9,由于我公司的官僚作风,无法更改为任何更新的版本。导入EL作为依赖也没有解决。
在 Tomcat 的根文件夹 -> lib 中,我用新的 3.0(来自本地 .m2\repository\javax\el\javax.el-api.0.0
)替换了旧的 el-api(它的 2.2 版本)。然后,正确隔离 tomcat 的依赖项(如图 here 所示)使我的 WAR 正确部署在 Tomcat 7.0.9
Hibernate 验证器 6.x -> Bean 验证 2.0 (JSR 380) -> EL3.0
Hibernate 验证器 5.x -> Bean 验证 1.1 (JSR 349) -> EL2.2
Bean 验证 1.0 (JSR 303) ->(我不确定)
所以,它也影响其他版本(tomcat,jdk,jsp,servlet)
如tomcat7、如果要使用Hibernate Validator,应该使用Hibernate Validator 5.x、el 2.2(和servlet 3.0、jsp 2.2和jdk 6+)
将 hibernate-validator 降级到版本 5,它将与 Tomcat 7 一起正常工作。 在我的例子中,我将下一个依赖项添加到我的 pom:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.4.3.Final</version>
</dependency>
或者您可以将更新的 el-api.jat 添加到 tomcat lib 文件夹。
为 Tomcat 7 的人添加我的答案并尝试应用所选答案。
如果添加依赖项对您没有帮助并且您继续获取
java.lang.NoClassDefFoundError: javax/el/ELManager
那是因为 Tomcat 7 不允许您使用 javax.*
包中的对象加载更现代的 jar。它将打印到日志:
jakarta.el-3.0.3.jar - jar not loaded. See Servlet Spec 3.0, section 10.7.2. Offending class: javax/el/Expression.class
解决方案是升级您的 Tomcat 或将 hibernate-validator 降级到最新的 5.x 版本。另一个(我的 POV 不太喜欢)选项是尝试替换 tomcat7/lib 文件夹中的罐子。