Fork me on GitHub

Spring Boot war 包方式启动问题

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

前提概要

  • Spring Boot 版本2.0.3.RELEASE
  • 打包方式

    1
    2
    - JDK1.8 编码 UTF-8
    - 依赖只引入了``` spring-boot-starter-web、spring-boot-starter-test

  • Tomcat 版本 7.0.82

问题

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

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

解决路径

缺少 jar 包

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

1
2
3
4
5
<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 即可。

参考地址:stackoverflow

------本文结束------
0%