依赖传递
第一列表示第一直接依赖,第一行表示第二直接依赖。传递依赖的范围一般和第一直接依赖一致,compile是一个例外。
compile | test | provided | runtime | |
---|---|---|---|---|
compile | compile | - | - | runtime |
test | test | - | - | test |
provided | provided | - | provided | provided |
runtime | runtime | - | - | runtime |
依赖调解
第一原则-路径最近者优先
A-B-C-Y A-D-Y
Y就是A的传递依赖。这个时候按照路径最短的那个获取,即拿到的是第二个Y。
第二原则-声明最先者优先
A-B-Y A-D-Y
两个Y的路径一样,这时候比较B和D的声明顺序,B在前则取第一个Y,D在前取第二个。
可选依赖
A-B B-X(可选) B-Y(可选)
X、Y为A的传递依赖,X、Y为可选依赖,所以不再向下传递。X、Y对A不产生直接影响,A使用B的过程中要显示声明X或者Y。
<optional>true</optional>
可选依赖并不推荐,正常的做法是分别存在包含X组件版本的B和包含Y组件版本的B。
排除依赖
A-B-Y(?)
Y为A的传递依赖,会被项目隐性引入,但是由于版权原因,或者版本稳定性原因等需要排除原有的Y,然后在A中声明另外的已知Y。
<exclusions>
<exclusion>//只需要两个子元素
<groupId>org.iSkyCode</groupId>
<artifactId>excJar</artifactId>
</exclusion>
</exclusions>
归类依赖
动态化设定,将依赖分类。如版本号,在更新的时候就可以把它的相关依赖全部升级。
<properties>
<junit.version>3.8.1</junit.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
</dependency>
</dependencies>