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

 更新时间:2025年01月26日 10:30:51   作者:荒·湮  
这篇文章介绍了处理jar包依赖冲突的几种方法,包括:优先原则、路径近者优先、排除原则、版本锁定原则、查看间接依赖、排包和处理jar包依赖冲突的总结

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
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使用如下方式排出

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

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

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • java实现图片验证码

    java实现图片验证码

    这篇文章主要为大家详细介绍了java实现图片验证码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • Java实现HttpGet请求传body参数

    Java实现HttpGet请求传body参数

    这篇文章主要为大家详细介绍了Java实现HttpGet请求传body参数的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-02-02
  • java基础之初始化ArrayList时直接赋值的4种方式总结

    java基础之初始化ArrayList时直接赋值的4种方式总结

    ArrayList是Java中的一个类,它是Java集合框架中的一部分,用于实现动态数组,下面这篇文章主要给大家介绍了关于java基础之初始化ArrayList时直接赋值的4种方式,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-07-07
  • 一文带你掌握SpringBoot中常见定时任务的实现

    一文带你掌握SpringBoot中常见定时任务的实现

    这篇文章主要为大家详细介绍了Spring Boot中定时任务的基本用法、高级特性以及最佳实践,帮助开发人员更好地理解和应用定时任务,提高系统的稳定性和可靠性,需要的可以参考下
    2024-03-03
  • Java多线程start()方法原理解析

    Java多线程start()方法原理解析

    这篇文章主要介绍了Java多线程start()方法原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • IDEA导入jar包的完整实现步骤

    IDEA导入jar包的完整实现步骤

    由于导入jar包项目存在很多不确定的问题,导致每次都需要调试、配置好多遍,对此特意记录下来,这篇文章主要给大家介绍了关于IDEA导入jar包的相关资料,需要的朋友可以参考下
    2024-01-01
  • 关于jackson序列化和feign返回值的问题

    关于jackson序列化和feign返回值的问题

    这篇文章主要介绍了关于jackson序列化和feign返回值的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • java泛型常用通配符实例解析

    java泛型常用通配符实例解析

    这篇文章主要介绍了java泛型常用通配符实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • Java字符串排序的几种实现方式

    Java字符串排序的几种实现方式

    这篇文章主要给大家介绍了关于Java字符串排序的几种实现方式, 使用Java平台进行字符串排序被认为是一件简单的工作,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-07-07
  • java 实现简单圣诞树的示例代码(圣诞节快乐)

    java 实现简单圣诞树的示例代码(圣诞节快乐)

    这篇文章主要介绍了java 实现简单圣诞树的示例代码(圣诞节快乐),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12

最新评论