1、依赖传递
情景:有两个项目father和son,其中son依赖于father.
father项目的maven依赖如下:
然后对father工程执行mvn install命令,将father项目安装到本地仓库。
在son工程pom.xml添加对father项目的依赖。如下图所示。
编译子工程,我们可以发现,只有father工程的commons-io传递到了子工程中,也就是说被依赖的工程只有作用域为compile的才会被传递到依赖工程中(这里暂且只讨论compile、test、provided三种作用域)。
2、依赖冲突
那么如果被依赖的工程有两个或两个以上,且被依赖的工程又存在相同依赖且版本不同,比如这里son工程依赖于father和uncle。而father又依赖于commons-io 2.4版本,uncle依赖于2.3版本。那么此时son依赖于哪个版本的commons-io呢,maven有如下两个规则:
1、先声明原则,即存在同级依赖冲突时,比如上文中的uncle和father。则谁先声明就传递谁的依赖。
2、就近原则,比如son依赖于father,而father又依赖于grandfather,而father和grandfather中存在依赖冲突commons-io,那么由于son和father是直接依赖,而和grandfather是间接依赖,所以采用father的依赖。
3、依赖传递排除
son依赖于father,father依赖于commons-io2.4,但是son工程中可能不需要commons-io这个依赖或者son工程需要依赖commons-io其它版本,在pom.xml中使用exclusions排除依赖,如下图所示。