Spring Boot通过bootRun或Jar运行时出现GraphQL Schema错误
解决Spring Boot启动时嵌入式Tomcat无法启动的问题
你碰到的是Spring Boot启动阶段嵌入式Tomcat初始化失败的典型问题,我整理了几个最常见的排查方向和解决方案,帮你快速定位问题:
1. 优先检查端口占用情况
Tomcat默认使用8080端口,如果这个端口已经被其他程序占用,直接就会启动失败。你可以用这些命令排查:
- Windows系统:
netstat -ano | findstr :8080,找到对应的PID后,在任务管理器里结束该进程 - Linux/macOS系统:
lsof -i :8080或者netstat -tulpn | grep :8080,然后用kill -9 <PID>终止占用端口的进程
嫌麻烦的话,也可以直接在application.properties或application.yml里换个端口:
server.port=8081
2. 排查依赖冲突或缺失
这是最常见的诱因,比如:
- 不小心同时引入了多个Servlet容器依赖(比如Tomcat和Jetty),Spring Boot无法确定使用哪个容器
- Spring Boot版本与Tomcat依赖版本不兼容,导致初始化时出现类加载错误
你可以用Gradle的依赖树命令查看所有依赖的细节:
./gradlew dependencies
重点关注spring-boot-starter-web下的Tomcat相关依赖,看看有没有重复引入或者被错误排除的情况。如果你的build.gradle里有类似下面的代码,且你没打算替换成其他容器(比如Jetty),请删掉这段排除配置:
implementation('org.springframework.boot:spring-boot-starter-web') { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' }
3. 检查配置文件的错误
有时候自定义的Tomcat配置写错了也会导致启动失败,比如:
server.tomcat.*开头的配置项格式错误- 自定义的Tomcat连接器、线程池配置参数不合理
你可以先暂时注释掉所有自定义的Tomcat配置,再尝试启动。如果能正常启动,再逐个恢复配置,慢慢排查出有问题的项。
4. 查看完整的错误堆栈
你提供的日志只显示了开头部分,真正的问题根源藏在Caused by开头的行里。比如:
- 如果看到
Caused by: java.net.BindException: Address already in use,那就是端口占用问题 - 如果看到
ClassNotFoundException,那就是依赖缺失或版本不匹配
把完整的错误日志打印出来,找到最底层的异常信息,就能精准定位问题了。
内容的提问来源于stack exchange,提问作者Young_Maker
相关产品推荐
相关产品推荐

