通过Docker将WAR包部署到Tomcat后访问接口返回404问题咨询
问题原因及解决方案
核心原因1:Web应用上下文路径不匹配
你将WAR包命名为demo-0.0.1-SNAPSHOT.war放入Tomcat的webapps目录下时,Tomcat默认会用WAR包的文件名作为该应用的上下文路径,也就是说你的接口实际可访问路径是http://localhost:8080/demo-0.0.1-SNAPSHOT/hello,而非直接访问/hello。
对应解决方法:
- 方式1:访问接口时加上上下文前缀,直接访问
http://localhost:8080/demo-0.0.1-SNAPSHOT/hello - 方式2:构建镜像时将WAR包重命名为
ROOT.war再复制到webapps目录,修改Dockerfile对应行为:
COPY demo-0.0.1-SNAPSHOT.war /usr/local/tomcat/webapps/ROOT.war
修改后应用的上下文路径就是根路径/,可直接访问/hello。
核心原因2:Tomcat版本与Spring Boot版本不兼容
你使用的Tomcat 10基于Jakarta EE规范,所有Servlet相关的包名已从javax.servlet.*改为jakarta.servlet.*,而常规的Spring Boot 2.x版本仍使用javax.servlet.*的包依赖,两者完全不兼容。这种情况会出现Tomcat日志显示部署成功,但所有请求都无法进入Spring MVC的调度逻辑,直接返回404。
对应解决方法:
- 方式1:将基础镜像替换为Tomcat 9版本,修改Dockerfile的基础镜像行为:
FROM tomcat:9-jdk8
- 方式2:将你的Spring Boot应用升级到3.x版本,适配Jakarta EE规范,即可正常在Tomcat 10上运行。
完成对应修改后,重新构建Docker镜像、启动容器即可正常访问接口。
内容的提问来源于stack exchange,提问作者E.T.
相关产品推荐
相关产品推荐

