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版本。