将Spring Boot WAR包部署到Tomcat时出现404错误求助
核心原因
Tomcat10基于Jakarta EE 9规范,API包名从javax.servlet全面替换为jakarta.servlet;而Spring Boot 2.x及以下版本依赖传统Java EE(javax.*)API,两者包名不兼容,直接部署会导致控制器无法被Tomcat正确识别,从而出现404错误。
具体解决步骤
升级Spring Boot版本到3.x及以上
Spring Boot 3.x开始全面适配Jakarta EE规范,原生支持Tomcat10+,这是解决该问题的根本方案。确保WAR打包配置正确
如果用Maven,需在pom.xml中配置:<packaging>war</packaging> <dependencies> <!-- 排除嵌入式Tomcat,避免与外部Tomcat冲突 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> </dependencies>如果用Gradle,配置如下:
plugins { id 'war' } dependencies { providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat' }确认访问路径正确
Tomcat部署WAR包后,默认上下文路径为WAR包的文件名(不含.war后缀)。比如你的WAR包名为tcjardemo.war,正确访问地址应为:http://localhost:8080/tcjardemo/show
若需直接通过/show访问,可将WAR包重命名为ROOT.war,或在Tomcat的server.xml中配置上下文路径为/。检查Tomcat日志排查问题
查看Tomcat的logs/catalina.out或localhost.log,若出现jakarta.servlet相关的类找不到错误,说明Spring Boot版本仍未适配Jakarta EE,需确认版本升级到位。
你的代码中SpringBootServletInitializer的继承和configure方法重写是正确的,无需修改。
内容的提问来源于stack exchange,提问作者Just Praveen

