当前位置: 首页 > news >正文

Maven 处理依赖冲突

Maven处理依赖冲突

  • 什么是依赖冲突?
  • 如何解决?
    • Maven自动处理依赖冲突的规则
      • 路径优先原则
      • 第一声明优先原则
        • 注意
      • 子模块覆盖父模块
        • 父模块声明dependency子模块覆盖dependency
        • 父模块声明dependencyManagement 子模块覆盖dependency
        • 父模块声明dependencyManagement 子模块覆盖dependencyManagement
    • Maven手动处理依赖冲突
      • Maven自动处理依赖后导致引入了低版本的依赖
        • 解决方案
          • exclusions
          • optional
        • 注意
    • 工具

什么是依赖冲突?

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

如何解决?

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

路径优先原则

当依赖冲突发生时,Maven 会优先选择路径最短的依赖版本。路径长度是指从当前项目到依赖的层级深度。例如:项目直接引入的a:v1,及b:v1,但b:v1中引入了a:v2。那么项目自动会引入a:v1。因为a:v1b: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内部的场景

<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

optionaltrue时,不将该依赖传递给外层。这样就可以避免造成依赖冲突的问题。
适用场景:可以修改package-h内部的pom.xml一般都为自己开发的jar包

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

注意

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

工具

idea插件:Maven Helper

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

相关文章:

  • 软件鉴定测试报告编写有哪些注意事项?又有什么作用?
  • vue3: pdf.js 2.16.105 using typescript
  • 【2025最新】gitee+pycharm完成项目的上传与管理
  • 雷赛伺服L7-EC
  • 如何解决Jmeter中的乱码问题?
  • JVM之jcmd命令详解
  • uniapp小程序轮播图高度自适应优化详解
  • 影楼精修-牙齿美型修复算法解析
  • SSHv2公钥认证示例-Paramiko复用 Transport 连接
  • 养生:塑造健康生活的良方
  • 【挑战项目】 --- 微服务编程测评系统(在线OJ系统)(二)
  • React 第三十八节 Router 中useRoutes 的使用详解及注意事项
  • HOT 100 | 【子串】76.最小覆盖子串、【普通数组】53.最大子数组和、【普通数组】56.合并区间
  • electron 结合 react(cra创建的) 创建桌面应用和打包桌面应用
  • 掌握Multi-Agent实践(三):ReAct Agent集成Bing和Google搜索功能,采用推理与执行交替策略,增强处理复杂任务能力
  • “ES7+ React/Redux/React-Native snippets“常用快捷前缀
  • 【K8S系列】Kubernetes常用 命令
  • CUDA编程 - CUDA编程中处理半精度浮点运算(FP16) - fp16ScalarProduct
  • 5.9-selcct_poll_epoll 和 reactor 的模拟实现
  • window 显示驱动开发-配置内存段类型
  • 理财经理泄露客户信息案进展:湖南省检受理申诉,证监会交由地方监管局办理
  • 山东14家城商行中,仅剩枣庄银行年营业收入不足10亿
  • 鸿蒙电脑正式亮相,五年布局积累超2700项核心专利
  • 美联储连续第三次维持利率不变,警示关税影响
  • 新消费观察| 零售品牌 “走出去” ,如何开辟“新蓝海”?
  • 印媒证实:至少3架印军战机7日在印控克什米尔地区坠毁