Tomcat服务真正就绪需同时满足进程存在、端口监听、HTTP可响应、日志显示启动完成;Spring Boot场景还需验证Actuator健康端点或加延时重试。

检查Tomcat进程是否存活
光看终端输出“Server startup in XXX ms”不等于服务真就绪了,尤其在CI/CD或Docker环境中,启动日志刷完后可能端口还没bind成功。最直接的办法是查进程和端口:
- Linux/macOS下用
ps aux | grep tomcat看Java进程是否存在,再配合lsof -i :8080(或你配置的server.port)确认端口监听状态 - Windows下用
tasklist /fi "imagename eq java.exe"+netstat -ano | findstr :8080 - 注意:有些IDE(如IntelliJ)内嵌Tomcat会起多个Java进程,得结合工作目录或JVM参数(如
-Dcatalina.base)区分
用HTTP请求验证Servlet容器是否响应
进程存在、端口监听,不代表Web容器能处理请求。必须发一个真实HTTP请求,观察返回码和内容。
- 最简方式:命令行用
curl -I http://localhost:8080,期望返回HTTP/1.1 200 OK或302 Found(默认首页重定向) - 如果返回
curl: (7) Failed to connect,说明端口未开放或防火墙拦截;返回404但连接成功,说明Tomcat起来了,只是没部署ROOT应用 - Java代码中可用
HttpURLConnection或HttpClient实现自动化检测,注意设置超时(setConnectTimeout),避免卡死
读取catalina.out日志判断启动完成点
Tomcat日志里有明确的启动完成标记,比轮询端口更轻量,适合脚本化检测。
- 启动成功的最后一行通常是:
INFO [main] org.apache.catalina.startup.Catalina.start Server startup in [.*] ms - 用
tail -f catalina.out | grep "Server startup in"可实时监听;自动化脚本里建议用grep -q "Server startup in" catalina.out配合循环+sleep - 注意:日志级别设为INFO以上才输出这行;若启用了
logback或log4j2自定义配置,可能被覆盖,需确认org.apache.catalina.startup.Catalina的logger级别
Spring Boot内置Tomcat的特殊验证方式
如果你用的是Spring Boot(spring-boot-starter-web),它封装了Tomcat,不能只依赖传统方式。
立即学习“Java免费学习笔记(深入)”;
- 启动类加
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT),然后注入TestRestTemplate发请求,这是最贴近真实场景的验证 - 检查Actuator端点:
curl http://localhost:8080/actuator/health,返回{"status":"UP"}才算真正就绪(前提是引入了spring-boot-starter-actuator) - 别依赖
ApplicationReadyEvent回调来“认为已启动”——它只表示Spring上下文初始化完毕,此时Tomcat可能还在绑定端口,仍有小概率请求失败
ApplicationReadyEvent触发了,curl仍可能瞬间失败,得加短延时或重试逻辑。










