部署WAR包至Tomcat9容器后出现Error 404问题求助
排查Docker部署Spring Boot WAR包到Tomcat后404的问题
1. 检查Tomcat容器内WAR包的解压状态
- 进入运行中的容器:
docker exec -it test_api sh - 查看
webapps目录下的内容,确认api.war是否被自动解压为api目录:ls /usr/local/tomcat/webapps - 如果未自动解压,检查Tomcat的
server.xml中Host节点的配置,确认开启了unpackWARs和autoDeploy:<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> - 也可以手动解压WAR包后重启容器尝试:
cd /usr/local/tomcat/webapps && unzip api.war -d api docker restart test_api
2. 验证Spring Boot WAR包的配置正确性
- 确认
pom.xml中打包类型为war,并排除内置Tomcat依赖:<packaging>war</packaging> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> - 检查启动类是否继承
SpringBootServletInitializer,这是外部Tomcat部署WAR包的必要条件:@SpringBootApplication public class ApiApplication extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(ApiApplication.class); } public static void main(String[] args) { SpringApplication.run(ApiApplication.class, args); } }
3. 检查Java版本兼容性(最可能的问题)
- Tomcat 9官方仅支持Java 8至Java 11,你的应用基于Java 19开发,版本不兼容会导致应用无法正常初始化(即使日志显示部署完成)。
- 查看容器内的Java版本:
docker exec test_api java -version - 解决方案:更换为支持Java 19的Tomcat镜像(如Tomcat 10.1.x),修改Dockerfile:
FROM tomcat:10.1-alpine LABEL key="MyName" ADD api.war /usr/local/tomcat/webapps/ EXPOSE 8080 CMD ["catalina.sh", "run"] - 重新构建镜像并启动容器:
docker build -t api . docker run -p 80:8080 --name test_api api
4. 确认访问路径与Spring Boot上下文配置一致
- 检查Spring Boot配置文件(
application.properties/application.yml)中的上下文路径:server.servlet.context-path=/api - 确保访问路径
http://localhost/api与配置的上下文路径匹配,若本地Tomcat的访问路径不同,需统一配置。
5. 查看Tomcat详细日志定位问题
- 查看容器内Tomcat的请求日志和错误日志,获取404的具体原因:
docker exec test_api cat /usr/local/tomcat/logs/localhost.log docker exec test_api cat /usr/local/tomcat/logs/localhost_access_log.$(date +%Y-%m-%d).txt
内容的提问来源于stack exchange,提问作者Ilya Tsygankov
相关产品推荐
相关产品推荐

