排查ClassNotFoundException的依赖问题,核心是确认目标类是否真在运行时classpath中可用:需用mvn dependency:tree -Dverbose检查依赖是否被冲突排除或exclusions移除,验证fat jar是否含该类(jar -tf),并核对scope是否匹配运行环境(如provided/test在本地运行时无效)。

排查 ClassNotFoundException 的依赖问题,核心是确认“目标类是否真的在运行时 classpath 中可用”,而不是只看 pom.xml 里有没有写依赖。
确认目标类所属的 jar 是否真被拉进来
很多情况下,pom.xml 写了依赖,但实际没进 classpath——可能被排除、被覆盖、或 scope 不对。
- 执行 mvn dependency:tree -Dverbose,搜索目标类全限定名(如
com.fasterxml.jackson.databind.ObjectMapper),看它来自哪个 artifact;如果搜不到,说明该 jar 根本没参与构建 - 留意输出中是否有 omitted for conflict 或 omitted for duplicate 字样——这表示版本冲突导致 Maven 主动丢弃了某个依赖
- 检查是否有
<exclusions>块意外移除了关键传递依赖(比如 Spring Boot starter 排除了 logback,结果导致 slf4j 类找不到)
验证打包后 jar 是否包含所需类
IDE 运行正常但 java -jar 报错?大概率是打包没把依赖打进 fat jar。
- 用 jar -tf your-app.jar | grep ObjectMapper(Linux/mac)或 jar -tf your-app.jar \| findstr ObjectMapper(Windows)直接检查 jar 包里有没有对应 .class 文件
- Maven 项目需确认是否用了
maven-shade-plugin或spring-boot-maven-plugin;默认mvn package生成的是 thin jar,不带依赖 - Spring Boot 项目若用
mvn install而非mvn spring-boot:repackage,生成的 jar 也无法直接运行
检查 scope 和运行环境是否匹配
provided 和 test 是高频“隐形雷”。编译能过,运行就炸。
立即学习“Java免费学习笔记(深入)”;
-
<scope>provided</scope>表示“容器会提供”,只适用于 Tomcat、Servlet 容器等场景;本地mvn exec:java或 JUnit 测试中必须改成compile或显式添加 runtime 依赖 -
testscope 的依赖不会传递给 main 模块;如果测试代码里用了某工具类,而 main 方法也调用了它,就得在主模块里单独声明 - Android 项目中,
androidx.*或com.google.android.material类在纯 Java 模块里不可见,需确认模块类型和 targetSdk 配置
定位实际生效的 classpath
运行时真正起作用的 classpath,可能和你想象的不一样。
- 命令行启动时,用
java -cp显式指定路径,注意分隔符:Linux/mac 用冒号(:),Windows 用分号(;);漏掉当前目录(.)会导致自定义类找不到 - IDE 启动时,查看 Run Configuration → Classpath 选项卡,确认 output 目录(如
target/classes)和所有依赖 jar 都已勾选 - Tomcat 等容器中,WEB-INF/lib 下的 jar 由 WebAppClassLoader 加载,不能直接访问 $CATALINA_HOME/lib 下的类,除非配置
shared.loader或修改委托策略


















