Spring Boot项目打包war部署Tomcat访问返回404错误如何解决?
Spring Boot部署Tomcat返回404问题解决方案
核心问题根因
该404问题90%以上是 Tomcat版本和Spring Boot版本不兼容 导致:
Tomcat 10.x开始全面使用Jakarta EE 9+规范,Servlet API包名从旧的javax.servlet.*全部变更为jakarta.servlet.*,而Spring Boot 2.x及更早版本默认依赖的是javax.servlet体系的API,完全无法在Tomcat 10+上正常加载。虽然Tomcat管理页显示部署成功,但Spring应用上下文实际没有启动,所有接口自然返回404。
解决方案
方案1(推荐,改动最小)
直接将Tomcat版本降级到9.x版本,Tomcat 9仍然使用javax.servletAPI,和Spring Boot 2.x版本完全兼容,替换Tomcat后重新部署war包即可正常访问。
方案2(需升级依赖)
如果必须使用Tomcat 10+,按以下步骤调整:
- 升级JDK版本到17及以上(Spring Boot 3最低要求Java 17,现有Java 16不满足要求)
- 将Spring Boot版本升级到3.0及以上,该版本已全面适配Jakarta EE规范
- 检查项目中所有引用
javax.*的代码,全部替换为对应jakarta.*的包路径
其他可选排查点
如果调整版本后仍有问题,按以下顺序排查:
- 你提到的JDK无JRE文件夹属于正常情况,Java 9及以上版本默认不内置独立JRE,只要JAVA_HOME配置正确就不会影响Tomcat和Spring Boot运行,无需针对这一点额外调整
- 检查
ServletInitializer类配置是否正确,需正确继承SpringBootServletInitializer并重写configure方法指向启动主类,参考配置:
public class ServletInitializer extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(Application.class); } }
- 检查
pom.xml中内置Tomcat依赖的scope是否设置为provided,避免和外部Tomcat依赖冲突:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency>
- 确认访问路径的上下文路径正确:如果你的war包命名为
abc.war,接口路径为/test,则完整访问路径为http://<Tomcat地址>:<端口>/abc/test,不要漏掉上下文路径/abc - 查看Tomcat日志目录下的
catalina.log、localhost.log文件,根据具体报错信息定位剩余问题。
内容的提问来源于stack exchange,提问作者Inzimam Tariq IT
相关产品推荐
相关产品推荐

