Maven实战(七)---传递依赖

假设A-->C  B-->A      ==> B-->C A依赖于C是直接依赖,B依赖于A是直接依赖,B依赖于C是传递依赖。

 

现象一

         

       举个例子:A-->log1.0  B-->log2.0 C-->A,B 那么我们来看依赖关系:

          User-core依赖于log4j 1.2.17

[java]  view plain copy print ?
  1. <dependency>  
  2.             <groupId>log4j</groupId>  
  3.             <artifactId>log4j</artifactId>  
  4.             <version>1.2.17</version>  
  5.         </dependency>  
 

         User-log包依赖于log4j 1.2.9

[java]  view plain copy print ?
  1. <dependency>  
  2.             <groupId>log4j</groupId>  
  3.             <artifactId>log4j</artifactId>  
  4.             <version>1.2.9</version>  
  5.         </dependency>  

 

        User-service依赖于user-core,也依赖于user-log


      

       可以看出user-service依赖的log4j的版本号为1.2.9。因为先依赖的log,后依赖于core,user-service依赖log4j相当于间接依赖。因此当有间接依赖的时候先依赖的哪个,就会依赖哪个包的间接依赖。

总结:间接依赖,如果级别相同,依赖于先引用的依赖。

 

 

现象二

         

       先依赖于user-core,再依赖于user-log.下面看commons-logging.jar的版本号:


                          

           User-core里面的Commons-logging的版本号为1.0.4

           User-log里面的Commons-logging的版本号为1.1.1

           User-service里面Commons-logging的版本号为1.1.1

 

        按照第一种,user-service里面的jar版本应该为1.0.4,现在为什么是1.1.1呢?

         我们来解析:



         User-core里面依赖于dbunit,而commons-logging.jar是作为依赖项被引用下来的

         User-log里面是直接引用commons-logging.jar

      因此它们处于不同的依赖树上,深度越浅越被优先选择。

 

小结

         1.在工程的依赖树上,深度越浅,越被有限选择。

         2.若两个依赖包处于依赖树上的同一层,则谁在前选择谁。

      

          总之,避免传递依赖时引起版本问题出现的最佳实践。一般情况下,如果工程直接依赖到某一框架的多个模块,最好全部声明这些依赖。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值