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

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

相关文章

  • Spring中接口FactoryBean作用及说明

    Spring中接口FactoryBean作用及说明

    这篇文章主要介绍了Spring中接口FactoryBean作用及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2026-05-05
  • Spring-Cloud-Function-Spel 漏洞环境搭建

    Spring-Cloud-Function-Spel 漏洞环境搭建

    这篇文章主要介绍了Spring-Cloud-Function-Spel 漏洞复现及搭建方法,搭建方法也很简单,首先需要安装maven jdk,具体安装过程跟随小编一起看看吧
    2022-03-03
  • SpringBoot整合activemq的案例代码

    SpringBoot整合activemq的案例代码

    ActiveMQ是消息队列技术,为解决高并发问题而生,本文通过案例代码给大家介绍pringBoot整合activemq的详细过程,感兴趣的朋友跟随小编一起看看吧
    2022-02-02
  • MyBatis绑定错误提示BindingException:Invalid bound statement (not found)的解决方法

    MyBatis绑定错误提示BindingException:Invalid bound statement (not f

    这篇文章主要介绍了MyBatis绑定错误提示BindingException:Invalid bound statement (not found)的解决办法,非常不错,具有参考借鉴价值,需要的的朋友参考下吧
    2017-01-01
  • SpringBoot实现微信小程序支付功能

    SpringBoot实现微信小程序支付功能

    小程序支付功能已成为众多应用的核心需求之一,本文主要介绍了SpringBoot实现微信小程序支付功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-04-04
  • Mybatis如何配置连接池

    Mybatis如何配置连接池

    本文通过实例代码给大家详细介绍了mybatis配置连接池的方法,非常不错,具有参考借鉴价值,感兴趣的朋友参考下吧
    2016-12-12
  • 关于Java中阻塞队列BlockingQueue的详解

    关于Java中阻塞队列BlockingQueue的详解

    这篇文章主要介绍了关于Java中阻塞队列BlockingQueue的详解,BlockingQueue是为了解决多线程中数据高效安全传输而提出的,从阻塞这个词可以看出,在某些情况下对阻塞队列的访问可能会造成阻塞,需要的朋友可以参考下
    2023-05-05
  • java内存模型jvm虚拟机简要分析

    java内存模型jvm虚拟机简要分析

    Java 内存模型的主要目的是定义程序中各种变量的访问规则, 关注在虚拟机中把变量值存储到内存和从内存中取出变量值这样的底层细节
    2021-09-09
  • listview点击无效的处理方法(推荐)

    listview点击无效的处理方法(推荐)

    下面小编就为大家带来一篇listview点击无效的处理方法(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • 解决httpServletRequest.getParameter获取不到参数的问题

    解决httpServletRequest.getParameter获取不到参数的问题

    这篇文章主要介绍了解决httpServletRequest.getParameter获取不到参数的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07

最新评论