Maven 处理依赖冲突

Maven处理依赖冲突

什么是依赖冲突?

当项目中直接或者间接的引入多个版本的同一依赖时则会出现依赖冲突

如何解决?

Maven自动处理依赖冲突的规则

路径优先原则

当依赖冲突发生时,Maven 会优先选择路径最短的依赖版本。路径长度是指从当前项目到依赖的层级深度。例如:项目直接引入的a:v1,及b:v1,但b:v1中引入了a:v2。那么项目自动会引入a:v1。因为a:v1 比 b:v1->a:v2 路径更短
实例:package-b 引入了 logback.1.5.14,及package-a 但是,package->a 引入了 logback.1.5.13。直接maven 选择了logback.1.5.14 符合路径优先原则

第一声明优先原则

如果两个依赖的路径长度相同,Maven 会优先选择在 pom.xml 文件中先声明的依赖版本。例如:项目直接引入了a:v1->b:v1,与a:v2->b:v2 但是a:v1是在a:v2前先声明的,那么就会选择a:v2中的b:v1 反之选择b:v2

注意

坑!!!!

直接在pom.xml中引入两个相同坐标但不同版本的依赖时,不会按照声明优先原则选择。而是使用最后声明的依赖。

[WARNING] 'dependencies.dependency.(groupId:artifactId:type:classifier)' must be unique: ch.qos.logback:logback-core:jar -> version 1.5.14 vs 1.5.13 @ line 23, column 21->表示同一个pom下不能声明相同的坐标。这就导致maven直接选择了最后声明的依赖

子模块覆盖父模块

子模块可以通过在自己的 pom.xml 文件中直接声明依赖的版本来覆盖父模块的版本。Maven 的依赖解析规则会优先考虑子模块中直接声明的依赖版本。

父模块声明dependency子模块覆盖dependency
父模块声明dependencyManagement 子模块覆盖dependency
父模块声明dependencyManagement 子模块覆盖dependencyManagement

Maven手动处理依赖冲突

Maven自动处理依赖后导致引入了低版本的依赖

package-g:1.0,package-g:2.0。通常我们是使用高版本的包,但是因为路径优先原则,导致使用了低版本的依赖。这种就需要手动解决了。

解决方案

思路:通常我们高版本的依赖兼容低版本的依赖。那么我只需要依赖高版本的依赖即可。

exclusions

使用于不能修改package-h内部的场景

xml 复制代码
<dependencies>
      <dependency>
          <groupId>com.mfyuan</groupId>
          <artifactId>package-j</artifactId>
          <version>1.0-SNAPSHOT</version>
      </dependency>
      <dependency>
          <groupId>com.mfyuan</groupId>
          <artifactId>package-h</artifactId>
          <version>1.0-SNAPSHOT</version>
          <exclusions>
              <exclusion>
                  <groupId>com.mfyuan</groupId>
                  <artifactId>package-g</artifactId>
              </exclusion>
          </exclusions>
      </dependency>
  </dependencies>

将低版本的依赖通过exclusion给排除掉即可。这样就没有发生依赖冲突了。

optional

optional为true时,不将该依赖传递给外层。这样就可以避免造成依赖冲突的问题。

适用场景:可以修改package-h内部的pom.xml一般都为自己开发的jar包

xml 复制代码
<dependencies>
    <dependency>
        <groupId>com.mfyuan</groupId>
        <artifactId>pacage-g</artifactId>
        <version>1.0-SNAPSHOT</version>
        <!--不将该依赖传递给外层-->
        <optional>true</optional>
    </dependency>
</dependencies>
注意

高版本如果没有兼容低版本怎么办?这种情况会造成编译失败,或者ClassNotFoundException。如果你又需要高版本的功能也需要低版本的功能那么这种问题是解决不了的。

工具

idea插件:Maven Helper

可以快速查看那些依赖存在冲突

相关推荐
wangchunyu1143 小时前
JAVA CompletableFuture异步编程实战
java·开发语言·python
paopaokaka_luck4 小时前
流浪动物救助与收养系统(DeepSeek AI对话、 ECharts多维分析、救助流程衔接、领养与回访衔接、 捐赠确认与公示、志愿者协作)
java·前端·javascript·人工智能·mysql·echarts·推荐算法
Thomas.Sir4 小时前
第9课:SpringBoot4.x Web开发基础:WebMvc自动配置、静态资源、请求参数接收
java·spring boot
程序 代码狂人4 小时前
切片表与分区表的区别(数据开发面试版)
java·大数据·开发语言·数据仓库·算法
2501_944521594 小时前
Immer 跨端三方库仓颉适配全流程
python·eclipse·django
信誓旦旦的程序猿5 小时前
【Python量化实战宝典 #26】止损与回撤控制手册:移动止损、最大回撤(Python 可跑)
python·1024程序员节·股票数据api·股票数据api接口·股票api数据接口·股票量化数据api·股票量化数据接口
2501_944521595 小时前
Deepmerge 跨端三方库仓颉适配全流程
java·python·eclipse·github
Patrick在香港5 小时前
同一行 strftime,两台机器跑出两种日期
python·datetime·时区·locale·日期处理
2601_967987375 小时前
用Python+OpenCV+YOLO写个游戏脚本:从自动瞄准到自动采集的保姆级教程
python·opencv·yolo·目标检测·游戏自动化
meiying88385 小时前
快递单号批量查询Python脚本:从手动到自动化的完整实现
开发语言·python·自动化