根本原因是容器内webapps目录为空或Servlet API版本不兼容;若为404且显示Tomcat默认灰色页面,说明请求抵达但无资源,需执行rm -rf webapps && cp -r webapps.dist webapps;若为500并报jakarta.servlet类转换异常,则需降级Tomcat至9.x或升级项目依赖为jakarta.servlet-api。

统信UOS中用Docker运行Tomcat后访问http://localhost:8080返回404或500,根本原因常是容器内webapps目录为空、Servlet API版本错配或应用未正确加载——不是端口不通,也不是防火墙拦截,而是Tomcat启动了却没内容可服务。
确认404来源:先看页面长什么样
打开浏览器开发者工具(F12)→ 切到 Network 标签 → 访问 http://localhost:8080 → 点击该请求 → 查看 Response 内容:
如果看到 Tomcat 默认灰色页面,写着 “HTTP Status 404 – Not Found”,说明请求已抵达 Tomcat,但webapps下没有可响应的资源;
如果看到白底红字 “Whitelabel Error Page” 或 “java.lang.ClassCastException: … javax.servlet.Servlet cannot be cast to jakarta.servlet.Servlet”,那就是 Servlet 包版本不兼容导致的 500 错误,必须改依赖。
修复空 webapps 目录(Docker 容器内)
方法一:进入容器手动复制
第一步:运行容器并记录容器IDsudo docker run -d -p 8080:8080 --name mytomcat tomcat:9
第二步:进入容器内部sudo docker exec -it mytomcat /bin/bash
第三步:删除空 webapps 并重建rm -rf webapps && cp -r webapps.dist webapps
【这一步不可跳过,否则ROOT应用永远无法加载】
第四步:退出并验证
按 Ctrl+D 退出容器 → 在宿主机浏览器中刷新 http://localhost:8080 → 应显示 Tomcat 欢迎页。
解决 500 错误:javax 与 jakarta 包冲突
如果你部署的是 Maven 构建的 WAR 包,并在日志里看到类似 ClassCastException: javax.servlet.http.HttpServlet cannot be cast to jakarta.servlet.http.HttpServlet,说明你用了 Tomcat 10+,但项目仍引用 javax.servlet-api。
方法1:降级 Tomcat 镜像(推荐给新手)
停止当前容器:sudo docker stop mytomcat → 删除:sudo docker rm mytomcat → 改用 Tomcat 9:sudo docker run -d -p 8080:8080 --name mytomcat tomcat:9 → 再次执行上一节的 cp -r webapps.dist webapps 步骤。
方法2:升级项目依赖(适用于明确要使用 Tomcat 10+ 的场景)
修改 pom.xml,将所有 javax.servlet 替换为 jakarta.servlet:
删掉: 及其子项;
加上:;
重新打包 WAR → 重新部署进 webapps 目录。
验证部署是否生效
进入容器后,执行:ls -l webapps/
应看到至少 ROOT 目录(来自 webapps.dist/ROOT);若部署了自定义 WAR,比如 myapp.war,则解压后应出现同名目录 myapp/。
再执行:tail -n 20 /usr/local/tomcat/logs/catalina.out
看到类似 Deployment of web application directory [/usr/local/tomcat/webapps/ROOT] has finished in [xxx] ms 才算真正加载成功。











