maven传递依赖规则

场景一:

learn-1 pom.xml 

<dependency>  
     <groupId>org.springframework</groupId>  
     <artifactId>spring-core</artifactId>  
     <version>4.1.4.RELEASE</version>  
     <!--依赖commons-logging 1.2的版本-->  
</dependency>  
<dependency>  
      <groupId>com.learn</groupId>  
      <artifactId>learn2</artifactId>  
      <version>0.0.1-SNAPSHOT</version>  
      <!--依赖commons-logging 1.1.3的版本-->  
      <optional>true</optional>       
</dependency>  

learn-2 pom.xml 

<dependency>  
     <groupId>commons-logging</groupId>  
     <artifactId>commons-logging</artifactId>  
     <version>1.1.3</version>  
</dependency>  
<dependency>  
     <groupId>junit</groupId>  
     <artifactId>junit</artifactId>  
     <version>3.8.1</version>  
     <scope>test</scope>  
</dependency>  

mvn dependency:tree分别查看依赖情况:  

[INFO] com.learn:learn2:jar:0.0.1-SNAPSHOT  
[INFO] +- commons-logging:commons-logging:jar:1.1.3:compile  
[INFO] \- junit:junit:jar:3.8.1:test  
[INFO] ------------------------------------------------------------------------  
[INFO] com.learn:learn1:jar:0.0.1-SNAPSHOT  
[INFO] +- org.springframework:spring-core:jar:4.1.4.RELEASE:compile  
[INFO] |  \- commons-logging:commons-logging:jar:1.2:compile  
[INFO] +- com.learn:learn2:jar:0.0.1-SNAPSHOT:compile  
[INFO] \- junit:junit:jar:3.8.1:test  
[INFO] ------------------------------------------------------------------------  

结论:  
learn1模块里的spring-core依赖common-logging的1.2版本,learn1依赖learn2,并且learn2也依赖common-logging,版本号是1.1.3。那么最后learn1将会依赖commons-logging的1.2版本,对于maven中的间接依赖,哪个依赖在pom文件中定义的位置在前面,就采用在前面定义的那个依赖。spring-core定义在learn2的前面,那么此时learn1就会依赖common-logging1.2的版本,如果spring-core和learn2的顺序调换一下,就会用commons-logging1.1.3的版本。 


场景二:

<dependency>  
    <groupId>org.springframework</groupId>  
    <artifactId>spring-core</artifactId>  
    <!-- 版本一 -->  
    <version>2.0.6</version>  
</dependency>  
<dependency>  
    <groupId>org.springframework</groupId>  
    <artifactId>spring-core</artifactId>  
    <!-- 版本二 -->  
    <version>4.1.4.RELEASE</version>  
</dependency>

分析:

[INFO] com.learn:learn1:jar:0.0.1-SNAPSHOT  
[INFO] +- org.springframework:spring-core:jar:4.1.4.RELEASE:compile  
[INFO] |  \- commons-logging:commons-logging:jar:1.2:compile  
结论:  
learn1将会依赖后声明的版本为4.1.4.RELEASE的spring-core依赖,一个Pom文件中声明了对一个项目的高低版本的依赖,使用最后声明者。 

场景三:

learn-1依赖项目learn-2,learn-3,learn-2依赖commons-logging:1.1.3版本,learn-3依赖learn-4, learn-4依赖commons-logging:1.2版本。那么最终learn-1依赖的commons-logging版本将会是1.1.3 版本的。这是因为maven采用最短路径优先原则 


场景四:

learn5 pom.xml 

<dependency>  
      <groupId>commons-logging</groupId>  
      <artifactId>commons-logging</artifactId>  
      <version>1.2</version>  
      <optional>true</optional>  
lt;/dependency>  

learn6 pom.xml 

<dependency>  
     <groupId>com.learn</groupId>  
     <artifactId>learn5</artifactId>  
     <version>0.0.1-SNAPSHOT</version>  
</dependency>  

分析结果:

[INFO] com.learn:learn6:jar:0.0.1-SNAPSHOT  
[INFO] \- com.learn:learn5:jar:0.0.1-SNAPSHOT:compile  
如果learn5把commons-logging的optional标签注释掉,分析的结果将不一样。 

[INFO]   
com.learn:learn2:jar:0.0.1-SNAPSHOT  
[INFO] \- com.learn:learn1:jar:0.0.1-SNAPSHOT:compile  
[INFO]    \- commons-logging:commons-logging:jar:1.2:compile  


结论:  
optional标签如果设置为true,意味着子模块将不依赖此模块,如果想依赖这个jar,必须在自己的pom.xml文件中在声明一遍。官方文档说:这样做为了避免错误jar违反license出现问题或者classpath发生问题。 
友情提示: 
如果我们的项目依赖出现问题,请善用mvn dependency:tree来查看依赖情况。 
在附上一个mvn插件链接 http://maven.apache.org/plugins/index.html 以供我们学习或者解决我们的实际问题



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值