maven依赖jar包时版本冲突的解决

2023-10-29

1、第一声明优先原则

在pom.xml配置文件中,如果有两个名称相同版本不同的依赖声明,那么先写的会生效。

所以,先声明自己要用的版本的jar包即可。
所以,添加新依赖时要放在最后边,以防止新依赖替换原有依赖造成版本冲突。

2、路径近者优先

直接依赖优先于传递依赖,如果传递依赖的jar包版本冲突了,那么可以自己声明一个指定版本的依赖jar,即可解决冲突。

3、排出原则

传递依赖冲突时,可以在不需要的jar的传递依赖中声明排除,从而解决冲突。

<dependency>
        
  <groupId>org.apache.struts</groupId>  
  <artifactId>struts2-spring-plugin</artifactId> 
  <version>2.3.24</version>
        
  <exclusions>
          <exclusion>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
          </exclusion>
  </exclusions>
  
</dependency>

4、版本锁定原则(最常使用)

在配置文件pom.xml中先声明要使用哪个版本的相应jar包,声明后其他版本的jar包一律不依赖。解决了依赖冲突。

<properties>
        
  <spring.version>4.2.4.RELEASE</spring.version>
  <hibernate.version>5.0.7.Final</hibernate.version>
  <struts.version>2.3.24</struts.version>
    
</properties>
   
<!-- 锁定版本,struts2-2.3.24、spring4.2.4、hibernate5.0.7 -->
    
<dependencyManagement>    
  
  <dependencies>
    
    <dependency>    
      
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>      
      <version>${spring.version}</version>
      
    </dependency>
    
</dependencies>
  
</dependencyManagement>

5、查看jar包的间接依赖

如果发现某个jar包,自己的pom中并没有定义,想看一下是被哪个jar包间接引用的,执行以下命令,直接输出到当前项目下,然后在idea中打开,搜索要找的jar包名字即可。这里的 “±” 和"-"并没有什么意义,只是为了让分级看起来更直观。

mvn dependency:tree>temp

在这里插入图片描述

如果想看冲突和重复的具体情况,用verbose参数

mvn dependency:tree -Dverbose -Dincludes=[commons-collections]

因此,我们可以看到Commons Collections 2.0被选为2.1,因为它离它更近,并且默认情况下,Maven使用最近赢得策略解决版本冲突。

6、排包

在这里插入图片描述

如图可知jai_core是在icepdf-core被间接引用的,如果jai_core的间接引入造成了依赖冲突,可在icepdf-core使用如下方式排出

org.icepdf.os icepdf-core 6.2.2
<exclusions>
    <exclusion>
        <groupId>javax.media</groupId>
        <artifactId>jai_core</artifactId>
    </exclusion>
</exclusions>

7、处理jar包依赖冲突总结

简介:处理jar包依赖冲突,首先,对于多个jar包都引用同一jar包的情况,最好是在程序中显式定义被共同引用的jar包的依赖,来统一版本号,方便维护

如果A和B都依赖同一jar包C,可能会出现两种情况

A和B引用的C版本相同,这时按照pom定义顺序选择第一个即可,没有冲突问题,如果在项目的maven中显示定义了C依赖,那么用选择项目定义的依赖,反正version都一样,没有影响

A和B依赖的C版本不同,选择版本高的那个,这时会出现两种结果

(1) 高版本兼容低版本,所以不会出现问题
(2)高版本不兼容低版本,假如A依赖C2版本,B依赖C3版本,C3不兼容C2,maven选择了高版本C3,对A来说会出现问题​

有3种解决方法[1] [2]如果B版本也可依赖C2,在项目的maven中显示定义对C2的依赖,这样所有都使用C2版本[3]如果B版本不支持C2版本,只能降低B版本,找到依赖C2的B版本从功能性和可维护性考虑,高版本提供的功能更多,bug更少,优先考虑1再考虑2最后考虑3

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

maven依赖jar包时版本冲突的解决 的相关文章

随机推荐

  • Nginx安装步骤——离线安装与在线安装详解

    目录 Linux环境下Nginx的离线安装与在线安装详细步骤 一 离线安装 1 安装环境 2 安装nginx 二 在线安装 1 安装相关依赖 2 安装nginx nginx相关命令 1 查看nginx是否在运行 2 测试配置文件是否正确 3
  • 整数反转(三种解法)——leetcode

    题目描述 给出一个 32 位的有符号整数 你需要将这个整数中每位上的数字进行反转 示例 1 输入 123 输出 321 示例 2 输入 123 输出 321 示例 3 输入 120 输出 21 注意 假设我们的环境只能存储得下 32 位的有
  • HEVC学习之码流分析

    一 从分层编解码框架到NAL单元 以H 264为例 H 264适应不同网络之间的传输 主要原因是引入了分层结构 分为视频编码层 VCL 与网络抽象层 NAL 从而实现压缩编码与网络传输分离 通过H 264算法压缩的后的数据通过NAL VCL
  • 使用Compose构建Docker多容器应用及数据卷(一键环境及代码)

    首先安装compose 下载并移动到 usr local bin目录下 curl L https github com docker compose releases download 1 23 1 docker compose uname
  • Docker之私有镜像仓库Harbor搭建

    简介 Docker离不开可靠的镜像管理 官方默认的DockHub 虽然Docker官方也提供了公共的镜像仓库Registry 但是功能略显简单 Harbor是由VMware公司开源的企业级的Docker Registry管理项目 它包括权限
  • 【C#基础详解】(十五)面向对象 多态

    15 1 多态简介 1 多态的概念 让一个对象能够表现出多种的状态 类型 意味着有多重形式 在面向对象编程范式中 多态性往往表现为 一个接口 多个功能 假设有一个主人类 喂食不同的动物 不同动物对象调用方法的时候 对重复的代码频繁的修改 代
  • ES6 变量解构赋值的用途

    以下内容整理自 阮一峰 的 ECMAScript 6 入门 第三章 变量的解构赋值 解构赋值的用法 数组 let a b c 1 2 3 let foo true 对象 let foo bar foo aaa bar bbb let foo
  • 【NOIP2017普及组】甲、乙、丙三位同学选修课程,从 4 门课程中,甲选修 2 门,乙、丙各选修3 门,则不同的选修方案共有( )种。

    题目 NOIP2017普及组 甲 乙 丙三位同学选修课程 从 4 门课程中 甲选修 2 门 乙 丙各选修3 门 则不同的选修方案共有 种 A 36 B 48 C 96 D 192 解答 C 4 2
  • 如何开发企业微信小程序,和小程序有啥区别?

    很多人不知道企业微信小程序也是可以开发的 和小程序有啥区别 企业微信小程序和小程序的开发程序其实是没啥区别 都是去微信开发社区看开发文档就行 主要区别在于前面的配置上面 小程序开发是直接下载一个微信开发者工具 然后导入或者新建一个小程序就行
  • ffmpeg android jni端调用mediaCodec实现硬解码

    硬解码 用的是cpu上面固化的一段芯片 专门用来处理音视频的 硬解码不会大量占用cpu 也不会占用gpu 但解码的帧率是固化的 ffmpeg是c库 而android只在java端抛出mediaCodec 来实现硬解码 ffmepg已经为an
  • vector基本功能

    vector基本概念 功能 vector数据结构和数组非常相似 也称为单端数组 vector与普通数组区别 不同之处在于数组是静态空间 而vector可以动态扩展 动态扩展 并不是在原空间之后续接新空间 而是找更大的内存空间 然后将原数据拷
  • 「Electron|问题记录」解决npm install electron --save-dev 各种下载速度过慢、超时或者报错等问题

    本文主要记录安装electron时遇到的问题以及最终帮助我解决这些问题的方案 文章目录 背景 解决方案 验证是否安装成功 背景 开始捣鼓桌面端 想着希望web端和桌面端同时迭代 代码复用性可以强一点 选择了Electron作为技术选型 可惜
  • Java-实现Callable接口创建多线程

    Java 实现Callable接口创建多线程 1 实现Callable接口和实现Runnable比较 call方法可以有返回值 call方法可以抛出异常 被外部操作捕获异常 callable支持泛型 2 代码举例 实现Callable接口创
  • PHY芯片的使用(三)在linux下网络PHY的移植

    1 前言 配置设备树请参考上一章 此次说明还是以裕太的YT8511芯片为例 2 需要配置的文件及路径 a 在 drivers net phy 目录下添加 yt phy c 文件 一般来说该驱动文件由厂家提供 b 修改 drivers net
  • web前端简易制作之HTML

    1 文章标题 这里可以看出在 strong 加粗字体 4 下划线标签 u 5 删除标签 s 6 预格式化文本标签 保留文本的原有格式 pre标签 7 上标和下标 sup sub 8
  • 征服面试官:Handler 原理篇 掌握这篇面试题汇总,吊打面试官!

    1 Handler 实现机制 Handler 机制有几个核心类 Handler Looper Message MessageQueue Handler 机制是一个典型的生产者消费者模式 多个生产者 一个消费者 该模式是处理线程安全的一个经典
  • Linux 设置虚拟机IP时找不到该文件或目录?

    害死个人 跟着视频学hadoop 设置虚拟机IP的时候 跟着视频打vim etc sysconfig network scripts ifcfg ens33 硬说找不到该文件或目录 停了两天太折腾了 各种查才发现 视频里的是vim 空格 e
  • 根文件系统构建(BusyBox方式)

    目录 根文件系统简介 BusyBox构建根文件系统 BusyBox简介 编译BusyBox构建根文件系统 生成bin sbin usr linuxrc 向根文件系统添加lib库 创建其他文件夹 根文件系统初步测试 完善根文件系统 创建 et
  • win10系统docker创建ubuntu容器解决开发环境问题

    一 win10系统使用docker的原因 最近啊 在学习人工智能 深度学习 用的win10系统进行开发 老是出现一些莫名其妙的问题 无法解决 每天都在为环境问题搞得伤透了脑筋 说到底还是要使用Linux系统进行开发比较合适 那么最好的选择就
  • maven依赖jar包时版本冲突的解决

    1 第一声明优先原则 在pom xml配置文件中 如果有两个名称相同版本不同的依赖声明 那么先写的会生效 所以 先声明自己要用的版本的jar包即可 所以 添加新依赖时要放在最后边 以防止新依赖替换原有依赖造成版本冲突 2 路径近者优先 直接