Spring Boot 支持 JAR 包和 war 包两种打包方式。JAR 包方式运行简单,对于轻量的项目,从构造到部署极大的提升了效率;war 包方式对于启动参数、集群配置来说可能更方便一些。在使用 war 包方式的时候遇到了一个问题,记录下来?。

前提概要

  • Spring Boot 版本 2.0.3.RELEASE
  • 打包方式 <packaging>war</packaging>
  • JDK1.8 编码 UTF-8
  • 依赖只引入了 spring-boot-starter-web、spring-boot-starter-test
  • Tomcat 版本 7.0.82

问题

配置好项目及 Tomcat 部署后启动失败,有这么一行异常信息:

Caused by: java.lang.NoClassDefFoundError: javax/el/ELManager

解决路径

缺少 JAR 包

第一反应,缺少 JAR 包,在 pom 文件引入:

<dependency>
    <groupId>javax.el</groupId>
    <artifactId>javax.el-api</artifactId>
    <version>3.0.0</version>
</dependency>

重新启动后问题仍然存在,加入 <scope>provided</scope> 后仍然不行,失败

hibernate-validator 版本过高

搜索后有文章说是 当前版本的 Spring Boot,依赖的验证 hibernate-validator 版本太高,导致找不到 ELManager。查看项目依赖树,发现是 Web 依赖中的
image
查看其他项目中同样写法并不报错,排除这种原因。

Tomcat 版本

有人说 Tomcat7 提供的 el-api.jar 版本是 2.2,Tomcat8 的版本是 3.0,未尝试切换 Tomcat 版本。

最终解决

将下载的 el-api3.0 的 JAR 包拷贝到 $TOMCAT_HOME/lib 下替换之前的 el-api.jar 即可。

参考地址:Stack Overflow

Last modification:December 8, 2018
If you think my article is useful to you, please feel free to appreciate