Maven依赖的传递性

maven依赖具有传递性。如下:

我们可以看到maven-test-a项目(后续简称a项目)依赖了lombok,而maven-test-2B(后续简称2B项目)项目又只依赖了a项目,接下来我们看2B项目的Libraries如下:

我们可以看到a项目的lombok也被带到了2B项目中,这就是依赖的传递性。但是这种传递性也是有些规则的。
这里记录一下,我们在idea里面看到的Libraries. 其实是一个当前项目的idex,类似于git项目的idex文件,maven是不会提前把这些jar包加载到当前项目的缓存中来的,而是在项目编译时再根据index去优先在maven本地仓库加载。如果本地仓库没有,远程仓库也下载不到就会报错。我们刷新当前项目的maven的时候,maven就会去检查Libraries 下面的jar包是否在本地仓库都已经存在。

  • 2B项目引用a项目的依赖生命周期scope必须满足条件。
    如a以provided的scope引入lombok,那么2B再次引入a项目依赖时,就会发现lombok并不会通过a项目再传递到2B项目。
    但是2B项目调用的a项目的代码中已经使用到了lombokde相应方法,那么运行2B项目时不会报错吗?答案是肯定的,运行2B项目时会报找不到lombok的相应方法。所以这时我们需要再2B项目运行前提前加依赖引入lombok,这时引入的版本可以和a项目中的不一样,在2B项目中运行的a项目的代码使用的lombok的版本以当前项目2B引用的lombok的版本为准。其实就是pom的传递被关闭。
    更多详情可参考:Maven scope的相关值说明_TGO-Ming的博客-CSDN博客
  • 最短路径优先原则
    如A -> B -> C -> D(2.0) 同时 A->E ->D(1.0)
    那么在A项目中实际引用的是D项目的1.0版本,同时A项目调用C项目的代码C项目也会使用当前项目A所使用的D项目的1.0版本,而不是它原来在自己项目里面使用的2.0版本 (不论C项目使用插件打包时有没有将D2.0项目一并打入到C的jar包中,都以A最终引用的代码版本为准)。
  • 最先声明原则
    如A -> B -> D(2.0) 同时  A->E ->D(1.0) 那么这时最短路径优先原则就不适用了,这时A项目使用的是D项目的2.0版本还是1.0版本,就取决于A项目是在dependencies中先引入的是B项目还是E项目了,如果先引入的是B项目的依赖,那么A项目就是使用的B项目中引用的D 2.0版本,反之就是E项目中的D 1.0版本。
     


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值