应先定位根异常caused by,再用mvn dependency:tree -dverbose -dincludes=groupid排查依赖缺失或冲突,检查pom.xml中exclusions是否误删starter,通过--debug查看conditions evaluation report确认自动配置跳过原因,最后用class.forname验证类是否存在。

SpringBoot项目启动时报“找不到Bean”或“自动配置失败”,但日志里只显示Caused by: java.lang.NoClassDefFoundError或类似泛型异常,根本没提具体缺失哪个类——这种模糊报错会让排查陷入盲区,浪费大量时间反复猜。
先看根异常堆栈最底层的Caused by
打开完整启动日志,用Ctrl+F搜索Caused by,一直往下翻,找到最后一段Caused by。它才是真正的源头,上面几层只是连锁反应。比如看到Caused by: java.lang.NoClassDefFoundError: org/apache/http/ssl/SSLContextBuilder,说明缺的是HttpClient相关jar,不是MyBatis也不是Spring Web。
这一步跳过就等于在迷宫里闭眼走路,90%的人卡在这儿就去改pom.xml乱加依赖。
用mvn dependency:tree定位冲突或缺失
在项目根目录(含pom.xml)执行:
mvn dependency:tree -Dverbose -Dincludes=org.apache.http
把上面命令里的org.apache.http换成你从Caused by里抄到的类名的groupId(比如org.springframework、com.fasterxml.jackson、javax.validation等)。-Dverbose能暴露被Maven silently exclude掉的依赖,-Dincludes精准过滤,避免刷屏。
【注意:必须加-Dverbose,否则看不到被排除的依赖】
检查starter是否被意外exclude
打开pom.xml,搜索
只要看到
验证自动配置是否被条件化跳过
启动时加上--debug参数:
java -jar your-app.jar --debug
启动后会输出CONDITIONS EVALUATION REPORT,里面分三栏:Positive matches(满足条件生效的)、Negative matches(不满足条件跳过的)、Exclusions(被@ConditionalOnMissingBean等主动排除的)。重点看Negative matches里带AutoConfiguration字样的条目,比如DataSourceAutoConfiguration,旁边会写明“did not find class org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType”——这就告诉你真正缺的是哪个类。
手动触发类加载验证
在任意Controller或启动类里加一段临时代码:
try { Class.forName("org.apache.http.ssl.SSLContextBuilder"); System.out.println("✅ 类存在"); } catch (ClassNotFoundException e) { System.out.println("❌ 类不存在: " + e.getMessage()); }
把引号里的类名替换成Caused by里那个全限定名。运行后控制台直接打印✅或❌,比翻日志快十倍。确认缺失后,再回pom.xml补对应依赖,不用猜。











