Tomcat 7部署应用报java.lang.NoClassDefFoundError: javax/el/ELManager求助
问题原因分析
这问题我之前帮同事排查过,本质是EL表达式语言版本不兼容导致的——Tomcat 7和Tomcat 8自带的EL API/JAR版本差异太大:
- Tomcat 7 默认集成的是 EL 2.2 版本,这个版本里完全没有
javax.el.ELManager类,这个类是从EL 3.0才新增的API - Tomcat 8 默认集成的是 EL 3.0,所以你的应用在测试环境能正常运行,但部署到Tomcat 7时,就会因为找不到这个类抛出
NoClassDefFoundError
具体解决办法
根据你的项目依赖情况,分三种场景处理:
场景1:项目主动引入了高版本EL依赖
如果你的pom.xml里直接引入了EL 3.0+的依赖(比如javax.el-api),只需要把依赖的<scope>改成provided即可——因为Tomcat本身已经自带了EL实现,不需要把高版本EL打包到war包中:
<dependency> <groupId>javax.el</groupId> <artifactId>javax.el-api</artifactId> <version>3.0.0</version> <scope>provided</scope> <!-- 关键:让Tomcat使用自身自带的EL版本 --> </dependency>
如果是引入了Tomcat官方的EL API依赖,记得版本要对应Tomcat 7的EL 2.2版本,同样设置provided:
<dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-el-api</artifactId> <version>2.2.1</version> <scope>provided</scope> </dependency>
场景2:框架依赖间接引入了高版本EL
如果你的项目没有主动引入EL,但使用的框架(比如Spring、JSF等)依赖了高版本EL,可以用Maven命令查看依赖树,定位到引入高版本EL的模块:
mvn dependency:tree
找到对应的依赖后,在pom.xml中添加排除规则,去掉高版本EL的依赖:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>xxx</version> <!-- 你的框架版本 --> <exclusions> <exclusion> <groupId>javax.el</groupId> <artifactId>javax.el-api</artifactId> </exclusion> </exclusions> </dependency>
场景3:代码中主动使用了ELManager类
如果你的业务代码里直接调用了ELManager的API,那必须改写代码,换成EL 2.2支持的替代方案——比如用ELContext相关的方法来实现相同逻辑,因为EL 2.2并没有ELManager这个入口类。
额外注意事项
- 不要手动把高版本EL的jar包放到Tomcat 7的
lib目录下,这会和Tomcat自带的EL jar冲突,引发更多异常 - 确保你的项目所有依赖的EL版本都和Tomcat 7的EL 2.2版本兼容
内容的提问来源于stack exchange,提问作者Mister Lamp
相关产品推荐
相关产品推荐

