2026/1/14 16:59:40
网站建设
项目流程
做网站app公司前景,制作好的网页怎么变成网站,.net网站封装,wordpress 学习视频Maven依赖冲突怎么解决#xff1f;Jar包冲突排查指南
项目跑着好好的#xff0c;突然就报错了#xff1a;
NoSuchMethodError
ClassNotFoundException别慌#xff0c;十有八九是Maven依赖冲突。今天教你怎么排查和解决。
为什么会冲突#xff1f;
假设你的项目同时依赖了A…Maven依赖冲突怎么解决Jar包冲突排查指南项目跑着好好的突然就报错了NoSuchMethodError ClassNotFoundException别慌十有八九是Maven依赖冲突。今天教你怎么排查和解决。为什么会冲突假设你的项目同时依赖了A和B两个库项目依赖 A 项目依赖 B A 依赖 Guava 30.0 B 依赖 Guava 31.0Maven只会选一个版本的Guava但A和B各自需要的版本不同就可能出问题。常见报错NoSuchMethodErrorjava.lang.NoSuchMethodError: com.google.common.xxx原因运行时加载的类版本和编译时不一致某个方法在低版本里没有。ClassNotFoundExceptionjava.lang.ClassNotFoundException: org.apache.xxx原因依赖被排除了或者根本没引入。排查方法第一步查看依赖树mvn dependency:tree会显示项目所有依赖的层级关系。第二步搜索特定依赖依赖树太长看不过来可以过滤# 只看guava相关mvn dependency:tree -Dincludescom.google.guava第三步看冲突详情mvn dependency:tree -Dverbose会显示被省略的依赖- com.example:lib-a:jar:1.0 | \- com.google.guava:guava:jar:30.0 (被选中) \- com.example:lib-b:jar:2.0 \- (com.google.guava:guava:jar:31.0 - 被省略和30.0冲突)这样就能看出谁引入了哪个版本。解决方法方法1排除依赖让A不要带着它的GuavadependencygroupIdcom.example/groupIdartifactIdlib-a/artifactIdversion1.0/versionexclusionsexclusiongroupIdcom.google.guava/groupIdartifactIdguava/artifactId/exclusion/exclusions/dependency方法2强制指定版本在项目中直接声明依赖覆盖传递依赖!-- 强制使用31.0版本 --dependencygroupIdcom.google.guava/groupIdartifactIdguava/artifactIdversion31.0-jre/version/dependency方法3用dependencyManagement统一版本dependencyManagementdependenciesdependencygroupIdcom.google.guava/groupIdartifactIdguava/artifactIdversion31.0-jre/version/dependency/dependencies/dependencyManagement所有模块都会使用这个版本。常见冲突案例案例1日志框架冲突SLF4J: Class path contains multiple SLF4J bindings.项目里同时有logback和log4j的实现需要排除一个dependencygroupIdxxx/groupIdartifactIdxxx/artifactIdexclusionsexclusiongroupIdorg.slf4j/groupIdartifactIdslf4j-log4j12/artifactId/exclusion/exclusions/dependency案例2Jackson版本不一致Incompatible Jackson version用BOM统一版本dependencyManagementdependenciesdependencygroupIdcom.fasterxml.jackson/groupIdartifactIdjackson-bom/artifactIdversion2.15.0/versiontypepom/typescopeimport/scope/dependency/dependencies/dependencyManagementIDEA插件帮忙装个Maven Helper插件可视化看依赖冲突打开pom.xml点底部的Dependency Analyzer红色的就是冲突的依赖右键可以直接排除比命令行方便多了。预防措施1. 用BOM管理版本SpringBoot项目继承parent就自动管理了很多依赖版本parentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion3.2.0/version/parent2. 定期检查mvn dependency:analyze会提示哪些依赖用了但没声明哪些声明了但没用。本地没问题服务器报错有时候本地好好的部署到服务器就冲突。可能是服务器环境的jar包和本地不一样。我用星空组网把本地和服务器连起来直接SSH上去看# 看实际加载了哪个版本的jarcd/app/libls-la|grepguava或者启动时看类加载java -verbose:class -jar app.jar|grepguava能快速定位是哪个版本被加载了。小结依赖冲突排查流程mvn dependency:tree -Dincludesxxx找到冲突确定需要的版本exclusion排除 或 直接声明覆盖再次dependency:tree验证记住用BOM管理版本能避免大部分冲突。有问题评论区交流~