当前位置: 首页 > news >正文

SpringBoot 应用启动失败常见原因与排查思路

SpringBoot 一键启动的爽感谁用谁知道,但一旦启动失败——屏幕上一堆红字报错,有些同学就瞬间懵圈了,到底是哪里错了?该从哪查起?

今天就把 SpringBoot 启动失败的高频原因+排查步骤全讲透:从最基础的端口占用、配置文件错误,到复杂的依赖冲突、Bean 初始化失败,每个问题都给“现象+原因+解决方法”,以后再遇到启动失败,按这个流程查,5分钟内定位问题。

先掌握通用排查思路

不管遇到哪种启动失败,先按这4步走,别上来就瞎改代码:

  1. 看日志

    :重点看日志里的ERROR/Exception关键词,找到“根异常”(最下面的 Caused by);

  2. 定位范围

    :根据异常类型判断是配置问题、依赖问题、代码问题还是环境问题;

  3. 缩小排查面

    :注释掉非核心代码/配置,逐步恢复,找到触发失败的关键点;

  4. 验证解决

    :改完后重启,看是否解决,没解决就回到第一步,重点排查未覆盖的点。


实战1:高频启动失败场景(现象+原因+解决)
场景1:端口被占用(最常见)
现象:

启动日志报错:

ERROR 12345 --- [ main] o.s.b.web.embedded.tomcat.TomcatWebServer : Tomcat started on port 8080 (http) failed: port 8080 already in use
原因:

8080 端口被其他程序(比如另一个 SpringBoot 应用、Tomcat、Nginx)占用。

解决方法:
  • 临时解决:改配置文件的server.port(比如改成 8081),或启动时指定端口:```bash java -jar app.jar --server.port=8081 ```

  • 彻底解决:找到占用端口的进程并杀掉:```bash # Windows netstat -ano | findstr "8080" # 找到进程ID(PID) taskkill /F /PID 进程ID # 杀掉进程 # Linux/Mac lsof -i:8080 # 找到进程ID kill -9 进程ID ```

场景2:配置文件语法错误
现象:

启动日志报错(YAML 错误为例):

ERROR 12345 --- [ main] org.yaml.snakeyaml.scanner.ScannerException : while scanning a simple key in 'reader', line 10, column 5: port:8080 ^ expected ':' at line 10, column 6: port:8080 ^
原因:
  • YAML 文件:冒号后没加空格、用 Tab 缩进、大小写错误;

  • Properties 文件:键值对格式错误、特殊字符没转义。

解决方法:
  • YAML 排查要点:

  1. 冒号:后必须加 1 个空格(port: 8080正确,port:8080错误);

  2. 缩进只用 2 个空格,别用 Tab;

  3. 字符串含特殊字符(:/空格)要加单/双引号;

  • Properties 排查要点:

    1. 键值对用=分隔(server.port=8080);

    2. URL 里的&转义为&(比如jdbc:mysql://...&useSSL=false要写成&useSSL=false)。

    场景3:依赖冲突/缺失
    现象1(依赖冲突):

    启动日志报错:

    ERROR 12345 --- [ main] org.springframework.context.ApplicationContextException : Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.NoSuchMethodError: org.springframework.web.servlet.mvc.condition.PatternsRequestCondition.(Ljava/util/Set;)V
    原因:

    不同依赖引入了同一个类的不同版本(比如 SpringFox 和 SpringBoot 版本不兼容)。

    解决方法:
    1. 用 Maven/Gradle 查看依赖树,找到冲突的依赖:

    # Maven mvn dependency:tree > dependency.txt # 导出依赖树到文件 # 搜索冲突的包(比如 spring-webmvc) grep "spring-webmvc" dependency.txt
    1. 排除低版本/不兼容的依赖:

    1<dependency> 2<groupId>xxxgroupId> 3<artifactId>xxxartifactId> 4<exclusions> 5<exclusion> 6<groupId>org.springframeworkgroupId> 7<artifactId>spring-webmvcartifactId> 8exclusion> 9exclusions> 10dependency>
    现象2(依赖缺失):

    启动日志报错:

    ERROR 12345 --- [ main] org.springframework.boot.diagnostics.LoggingFailureAnalysisReporter : *************************** APPLICATION FAILED TO START *************************** Description: Cannot determine embedded database driver class for database type NONE Action: If you want an embedded database (H2, HSQL or Derby), please put it on the classpath.
    原因:

    配置了数据库连接,但没引入数据库驱动依赖(比如mysql-connector-java)。

    解决方法:

    pom.xml里添加缺失的依赖:

    1<dependency> 2<groupId>com.mysqlgroupId> 3<artifactId>mysql-connector-jartifactId> 4<scope>runtimescope> 5dependency>
    场景4:Bean 初始化失败
    现象:

    启动日志报错:

    ERROR 12345 --- [ main] org.springframework.beans.factory.BeanCreationException : Error creating bean with name 'userService': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.xxx.mapper.UserMapper' available: expected at least 1 bean which qualifies as autowire candidate.
    常见原因:
    1. @Autowired

      注入的 Bean 不存在(比如 Mapper 没加@Mapper注解);

    2. 主启动类包扫描范围不对(比如 Controller/Mapper 在主启动类的子包外);

    3. Bean 初始化方法抛异常(比如@PostConstruct方法报错)。

    解决方法:
    1. 检查注解:Mapper 加@Mapper,Service 加@Service,Controller 加@RestController

    2. 扩大包扫描范围:主启动类加@ComponentScan("com.xxx")(指定根包);

    3. 检查初始化方法:去掉@PostConstruct里的危险代码,或捕获异常。

    场景5:数据库连接失败
    现象:

    启动日志报错:

    ERROR 12345 --- [ main] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Exception during pool initialization. com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
    原因:
    • 数据库地址/端口/用户名/密码错误;

    • 数据库服务没启动;

    • 防火墙禁止应用访问数据库;

    • 数据库连接 URL 格式错误。

    解决方法:
    1. 核对配置文件里的数据库参数:

    1spring: 2 datasource: 3url: jdbc:mysql://192.168.1.100:3306/test_db?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai 4username: root 5password:123456
    1. 测试数据库连通性:

    1# 用 mysql 客户端测试 2mysql -h192.168.1.100 -P3306-u root -p123456
    1. 检查数据库服务状态(Linux):

    1systemctl status mysqld # 查看 MySQL 是否启动
    场景6:启动类错误
    现象:

    启动后无响应,或报错“找不到主类”:

    Error: Could not find or load main class com.xxx.SpringbootDemoApplication Caused by: java.lang.ClassNotFoundException: com.xxx.SpringbootDemoApplication
    原因:
    • 主启动类没加@SpringBootApplication注解;

    • 打包插件配置错误,没指定主类;

    • 主类包名/类名写错。

    解决方法:
    1. 主启动类必须加@SpringBootApplication

    1@SpringBootApplication 2publicclassSpringbootDemoApplication{ 3publicstaticvoidmain(String[] args){ 4SpringApplication.run(SpringbootDemoApplication.class, args); 5} 6}
    1. 核对pom.xml里的打包插件配置:

    1<plugin> 2<groupId>org.springframework.bootgroupId> 3<artifactId>spring-boot-maven-pluginartifactId> 4<configuration> 5<mainClass>com.xxx.SpringbootDemoApplicationmainClass> 6configuration> 7plugin>

    通用排查工具(提升效率)
    1. IDEA 自带工具

    • 启动时打开「Run/Debug Configurations」→ 勾选「Enable debug output」,打印更详细的启动日志;

    • 用「Maven Projects」→「Dependencies」查看依赖树,直观看到冲突依赖。

  • 日志级别调整


    启动时加参数,打印 DEBUG 级日志,看更详细的启动过程:```bash java -jar app.jar --logging.level.root=DEBUG ```

  • SpringBoot 启动诊断


    SpringBoot 自带失败分析器,日志里会提示「Action」(解决建议),重点看这部分。


  • 启动失败的 5 个坏习惯
    1. 不看日志直接改代码

      :上来就瞎改配置、删依赖,越改越乱;

    2. 忽略“Caused by”

      :只看最上面的异常,不看根原因(根异常才是关键);

    3. 依赖随便加

      :看到别人的代码里有啥依赖就加啥,导致依赖冲突;

    4. 配置文件手写

      :不用 IDE 提示,手动敲 YAML/Properties,容易犯语法错误;

    5. 生产环境直接复制开发配置

      :比如开发用的自签名证书、测试库地址,直接丢到生产。


    下一期,咱们会讲:SpringBoot 应用监控(Actuator + Prometheus + Grafana),实时看应用状态,提前发现问题,避免线上故障。

    如果这篇文章帮你搞定了启动失败的排查,麻烦点个赞、在看,关注我,后续还有更多 SpringBoot 排障实战技巧,从入门到精通~

http://www.jsqmd.com/news/533351/

相关文章:

  • Unity ComputeShader实战:用GPU 0.4秒生成8K图像,CPU却要22秒?
  • AI、能源与电气领域SCI期刊投稿全攻略:从选刊到排版的避坑指南
  • DeepWiki-Open本地化部署实践指南
  • nli-distilroberta-base企业应用:内部知识库问答系统中的答案逻辑有效性过滤
  • RapidOCR高效处理与多场景适配:让OCR结果无缝对接业务系统的全指南
  • UE5性能调优实战:手把手教你用Unreal Insights揪出卡顿元凶(附完整配置流程)
  • 共话2026年太阳能光伏安装,点点电工在上海等地表现出色 - 工业品网
  • Prescan从入门到实战:手把手教你搭建AEB仿真环境(附避坑指南)
  • 软工毕业设计最新方向怎么做
  • Vue3项目如何在信创环境下跑起来?保姆级配置指南(含火狐52.3适配)
  • OpenClaw低代码方案:Qwen3.5-4B-Claude模型可视化流程编排
  • 四平道路划线推荐哪家,性价比高的排名情况如何 - 工业推荐榜
  • 别再只加0.1uF电容了!直流电机EMC整改,电容引线多长才算‘短’?
  • 历史路网数据获取的5种方法:从OSM到遥感影像的实用技巧
  • TD3算法三大改进解析:为什么它能解决DDPG的高估问题?
  • 效率提升:基于快马生成ansible脚本,批量自动化部署mac版openclaw
  • 从iPhone面捕到3D动画:手把手教你用ARKit 52个BlendShape驱动DAZ角色(含MetaHuman插件设置)
  • 三分钟上手Kimi CLI:让AI成为你的终极命令行伙伴
  • Fang算法 vs Chan算法:TDOA定位场景下的选择指南与性能对比
  • 聊聊四平好用的道路划线品牌,推荐几家 - myqiye
  • 避免栈溢出!手把手教你使用e2studio和STM32CubeIDE进行静态栈分析
  • 嵌入式方向输入抽象库:摇杆与按键的语义化状态映射
  • 别再死记硬背真值表了!用Simulink亲手搭建一个SR触发器,理解双稳态存储的底层逻辑
  • 2026年全国热门会计培训机构排名,附近成人学会计培训班哪家靠谱 - 工业品牌热点
  • 别只怪遮挡!从数据关联角度,重新理解DeepSORT中的ID跳变问题
  • 别再只写Verilog了!用FPGA从零实现一个以太网MAC控制器(基于RGMII接口)
  • 多平台协同:重构AI智能工作流的技术实践
  • 晋中靠谱的团建活动企业推荐,富有趣团建服务好吗? - mypinpai
  • 机器人仿真框架完全指南:从环境配置到智能控制的实战路径
  • Qt Creator工具栏字体太小看不清?一个CSS文件+启动参数轻松搞定(附Win/Mac路径)