maven查看项目依赖并解决依赖冲突的问题

一、问题

项目开发过程中,经常会遇到jar冲突,然后maven根据自己的规则进行冲突解决,导致项目在运行的过程中报错。

1、maven自动解决依赖冲突的规则是什么?

2、如何查看当前项目的maven的依赖树?

3、如何从依赖树中找到自己预期的版本,是被那个jar给覆盖了?

4、如何人工进行依赖冲突解决,达到使用目的?

 

二、解决问题

1、maven自动解决依赖冲突的规则是什么?

第一原则:路径最近者优先

项目A有如下的依赖关系:

A->B->C->X(1.0)

A->D->X(2.0)

则该例子中,X的版本是2.0

 

第二原则:路径相等,先声明者优先

项目A有如下的依赖关系:

A->B->Y(1.0)

A->C->Y(2.0)

若pom文件中B的依赖坐标先于C进行声明,则最终Y的版本为1.0

2、如何查看当前项目的maven依赖树?

//进入项目的pom.xml文件的目录下,运行如下命令
//这个是正常依赖的树
mvn dependency:tree

//这个命令是查看maven是如何解决依赖冲突的依赖树
mvn -Dverbose dependency:tree

//如果想将依赖树打印到指定文件中,则命令如下
mvn -Dverbose  dependency:tree -Doutput=/Users/shangxiaofei/sxfoutput.txt

3、如何从依赖树中找到自己预期的版本,是被那个jar给覆盖了?

  • 递归依赖的关系列的算是比较清楚了,每行都是一个jar包,根据缩进可以看到依赖的关系。
  • 最后写着compile的就是编译成功的。
  • 最后写着omitted for duplicate的就是有jar包被重复依赖了,但是jar包的版本是一样的。
  • 最后写着omitted for conflict with xxxx的,说明和别的jar包版本冲突了,而该行的jar包不会被引入。比如上面有一行最后写着omitted for conflict with 3.4.6,那么该行的zookeeper:jar:3.4.8不会被引入,会引入3.4.6版本
  • 最后写着version managed from 2.3 ;omitted for duplicate ,表示最终使用commons-pool2最终会使用2.4.2,拒绝使用<dependencyManagement></dependencyManagement>中声明的2.3版本
  • 最后写着version managed from 1.16.8 ;表示最终使用lombok:jar:1.16.22版本
     

4、如何人工进行依赖冲突解决,达到使用目的?

解决重复依赖和冲突的方法:

1,修改pom文件中两个dependency元素的位置。如果两个dependency都引用了一个jar包,但是版本不同,classloader只会加载jar包在pom文件中出现的第一个版本,以后出现的其他版本的jar包会被忽略。

不建议使用该方法,因为引用不同版本的jar包本身就是很危险的。

2,使用<exclusions>标签来去掉某个dependency依赖中的某一个jar包或一堆jar包,<exclusion>中的jar包或者依赖的相关jar包都会被忽略,从而在两个dependency都依赖某个jar包时,可以保证只使用其中的一个。

可以这么写:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>dubbo</artifactId>
    <version>2.8.3.2</version>
    <exclusions>
        <exclusion>
            <artifactId>guava</artifactId>
            <groupId>com.google.guava</groupId>
        </exclusion>
        <exclusion>
            <artifactId>spring</artifactId>
            <groupId>org.springframework</groupId>
        </exclusion>    
    </exclusions>
</dependency>

=================================================================

其他更多maven依赖相关内容,参见博客maven查看项目依赖并解决依赖冲突的问题 ​​​​​​​

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值