maven为什么发生依赖冲突?怎么解决依赖冲突?

星河滚烫你是人间理想 / 03-21 / 12点赞 / 0评论 / 801阅读
## maven为什么发生依赖冲突?怎么解决依赖冲突? 我们在开发的时候,偶尔会遇到依赖冲突的时候,一般都是NoClassDefFoundError、ClassNotFoundException、NoSuchMethodError。打开搜索框又发现有这个类,明明就是引入进来了,就是找不到,让人头疼 ### 1. 依赖冲突场景 在maven中依赖管理,依赖是可以传播的 假设:我有个A项目。第一步A项目引入B依赖,B依赖又会引入C依赖(版本1.1),那么A项目就同时拥有了B、C依赖(版本1.1),第二步我再引入D依赖,D依赖引入C依赖(版本1.2) 图解: ```csharp 第一步:A -> B -> C(1.1版本) 第二步:A -> D -> C (1.2版本) ``` 问题来了,maven会取哪个版本的C进行引入? ### 2. 当冲突时maven怎么样选择 针对依赖冲突场景提出的问题,答案是:1.1版本 为什么是1.1 版本?因为maven有几条原则,按照原则优先级选择 #### 2.1 就近原则 哪个依赖离的近取哪个 假设:我有个A项目。第一步A项目引入B依赖,B依赖又会引入C依赖(版本1.1)。第二步,在本项目pom中引入C依赖(版本1.2) 图解: ```csharp 第一步:A -> B -> C(1.1版本) 第二步:A -> C (1.2版本) ``` 那必须是1.2版本啊 #### 2.2 第一声明者原则 通俗一点就是,就近原则如果相同判断不出来,谁先来谁选择谁 假设:我有个A项目。第一步A项目引入B依赖,B依赖又会引入C依赖(版本1.1),那么A项目就同时拥有了B、C依赖(版本1.1),第二步我再引入D依赖,D依赖引入C依赖(版本1.2) 图解: ```csharp 第一步:A -> B -> C(1.1版本) 第二步:A -> D -> C (1.2版本) ``` 那必须是1.1版本啊 ### 3. 怎么样解决冲突? idea下载Maven Helper插件 点击pom文件左下角 ![image](https://cdn.res.knowhub.vip/c/2503/21/ce058bb3.png?G1YAAMTsdJxI8oS026hD2jvFHc2ARBZBpYT1es9Z%2byb6fgcjx2e0Pn1%2f%2bEvr0wm51AImMJQTgpcLSBmmloIwTIupxDUc) 点击Conflicts选择冲突选项 ![image](https://cdn.res.knowhub.vip/c/2503/21/3395d544.png?G1cAAETn9LwUqALZvtMdbIlTE20GLNIIKiWs13vO2jfR9wcYNT%2bj9Rn7w29an0Go5gYmMJQLUpALKCZihiRQcyiz5zUC) 右键,点击Exclude排除 ![image](https://cdn.res.knowhub.vip/c/2503/21/a49157b9.png?G1YAAMTsdJxIvES026hD2jvFHc2ARBZBpYT1es9Z%2byb6fgdD4jNan74%2f%2fKX16QQpVsAEhnJG8OkCsoENEkyrGotaXMMB) 返回pom文件发现自动加了exclusions标签进行排除 ```csharp poi-ooxml-schemas org.apache.poi ``` 一般来说取高版本的,因为高版本的一般都会兼容低版本