定位 Java 依赖问题(依赖冲突、版本不对、缺失、传递依赖异常等)通常可以按下面系统化的思路来做。
常见现象包括:
NoClassDefFoundError / ClassNotFoundExceptionNoSuchMethodError / NoSuchFieldErrormvn dependency:tree
查看某个依赖:
mvn dependency:tree -Dincludes=com.fasterxml.jackson.core
常见分析命令:
mvn dependency:analyze # 未使用但声明 / 使用但未声明
mvn dependency:tree -Dverbose
冲突定位:
./gradlew dependencies
指定配置:
./gradlew dependencies --configuration compileClasspath
冲突排查:
./gradlew dependencyInsight --dependency jackson-databind
dependency:tree 中最靠近根的版本通常生效<exclusions> 排除传递依赖<exclusion>
<groupId>xxx</groupId>
<artifactId>yyy</artifactId>
</exclusion>
implementation('org.example:lib:1.0') {
exclude group: 'com.foo', module: 'bar'
}
或强制版本:
configurations.all {
resolutionStrategy {
force 'com.fasterxml.jackson.core:jackson-databind:2.15.2'
}
}
System.out.println(
MyClass.class.getProtectionDomain()
.getCodeSource().getLocation()
);
-verbose:class
可以看到类从哪个 jar 加载。
-XX:+TraceClassLoading
症状:
NoSuchMethodError定位:
dependency:treegetProtectionDomain().getCodeSource()原因:
定位:
dependency:tree -DverbosedependencyInsightprovided / runtime / test 用错检查:
如:
javax.annotation vs jakarta.annotationorg.slf4j vs commons-logging定位:
mvn spring-boot:run
或查看:
java -jar app.jar --debug
Spring Boot 会输出:
BOM 管理:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
</dependency>
</dependencies>
</dependencyManagement>
dependency:tree 或 dependenciesexclusions / force 修正如果你愿意,可以把:
dependency:tree 片段发出来,我可以直接帮你定位具体依赖问题。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。