Spring Boot应用部署War包遇404错误,Jar包运行正常求助
问题分析与解决方案
核心原因
你遇到的404问题本质是Tomcat 10与Spring Boot 2.x的API兼容性冲突:
- Tomcat 10.1.x基于Jakarta EE 9+,所有Java EE相关包名从
javax.*改为jakarta.* - Spring Boot 2.7.x仍基于传统Java EE 8,依赖
javax.*包,两者API不兼容,导致部署后Servlet无法正常注册,从而出现404(日志无报错是因为应用启动流程未触发致命异常,但核心Web组件未初始化)
另外,Jar包能正常运行是因为Spring Boot内置的Tomcat版本为9.x(与Spring Boot 2.x完全兼容),而外部Tomcat 10是独立进程,不存在内置Tomcat的适配逻辑。
解决方案
方案1:降级Tomcat到9.x版本
这是最直接的解决方式,无需修改项目代码:
- 下载Apache Tomcat 9.x(推荐最新稳定版,如9.0.78)
- 停止当前Tomcat 10服务,替换为Tomcat 9
- 重新通过Manager部署
myapp.war,访问http://localhost:8080/myapp即可正常访问
方案2:修改Spring Boot项目适配Tomcat 10
若必须使用Tomcat 10,需对项目进行Jakarta API适配:
调整主类继承
SpringBootServletInitializer(打War包必须配置)
确保你的Spring Boot主类继承该类并覆盖configure方法,让外部Tomcat能正确启动Spring应用:@SpringBootApplication public class MyAppApplication extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(MyAppApplication.class); } public static void main(String[] args) { SpringApplication.run(MyAppApplication.class, args); } }替换依赖为Jakarta兼容版本
在pom.xml中添加Tomcat Jakarta迁移依赖,并调整Spring Boot的Tomcat依赖:<packaging>war</packaging> <dependencies> <!-- 排除默认的javax版Tomcat依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> <!-- 添加Jakarta版Tomcat依赖 --> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-core</artifactId> <version>10.1.12</version> </dependency> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-websocket</artifactId> <version>10.1.12</version> </dependency> <!-- 添加Jakarta EE API依赖 --> <dependency> <groupId>jakarta.servlet</groupId> <artifactId>jakarta.servlet-api</artifactId> <version>6.0.0</version> <scope>provided</scope> </dependency> </dependencies>迁移代码中的
javax.*引用到jakarta.*
替换项目中所有javax.servlet、javax.annotation等包路径为jakarta.servlet、jakarta.annotation
注意:该方案适配成本较高,若没有特殊需求,优先选择方案1降级Tomcat。
额外检查点
- 确认War包部署后的上下文路径:Tomcat默认使用War包文件名(去掉
.war)作为上下文路径,若你部署的是myfile.war,访问路径应为http://localhost:8080/myfile,而非/myapp(需与Jar包的上下文路径对应) - 检查Tomcat的
webapps目录,确认War包已正确解压为myapp文件夹
内容的提问来源于stack exchange,提问作者jkfe
相关产品推荐
相关产品推荐

