Docker Tomcat镜像部署Spring Boot WAR包失败:出现404错误
解决Spring Boot WAR包部署Tomcat Docker后404的思路
1. 修正Spring Boot WAR打包的核心配置
- 主类必须继承
SpringBootServletInitializer并重写configure方法,否则外部Tomcat无法识别Spring Boot应用:
@SpringBootApplication public class FeedbackFormApplication extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(FeedbackFormApplication.class); } public static void main(String[] args) { SpringApplication.run(FeedbackFormApplication.class, args); } }
- 构建文件里要明确打包方式为
war,同时排除内置Tomcat依赖(以Maven为例):
<packaging>war</packaging> <dependencies> <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> <!-- 引入Tomcat Servlet API,仅编译阶段生效 --> <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-servlet-api</artifactId> <version>8.5.99</version> <scope>provided</scope> </dependency> </dependencies>
2. 核对请求路径的上下文根
- Tomcat默认用WAR包名作为上下文根,你的应用上下文根是
feedback-form,所以本地运行的/api/feedback路径,部署后要改为/feedback-form/api/feedback - 若想直接用根路径(
/),可以把WAR包重命名为ROOT.war,或者在Tomcat的context.xml中添加配置:
<Context path="/" docBase="feedback-form" reloadable="true"/>
3. 排查容器内的应用日志
- 进入容器查看Spring Boot应用的启动日志,确认是否完成初始化:
docker exec -it tomcat tail -f /usr/local/tomcat/logs/localhost.log
- 查看Tomcat主日志
catalina.out,排查类加载失败、配置错误等异常:
docker exec -it tomcat tail -f /usr/local/tomcat/logs/catalina.out
4. 验证WAR包完整性
- 本地解压
feedback-form.war,检查WEB-INF/classes下是否有完整的编译后class文件,WEB-INF/lib下是否包含所有依赖包 - 确认
WEB-INF/web.xml是否正常生成(Spring Boot会自动生成,若存在手动修改的内容需检查是否有语法错误)
5. 修复Tomcat与JDK的版本兼容问题
- Tomcat 8最高仅支持JDK 10,而你用的是JDK 17,这是核心兼容性问题。需更换Tomcat镜像为支持JDK 17的版本,修改Dockerfile:
FROM tomcat:10.1-jdk17-temurin-focal EXPOSE 8080
内容的提问来源于stack exchange,提问作者Luca Pisoni
相关产品推荐
相关产品推荐

