5.7依赖调解
1.当一个项目有以下依赖关系的时候:A->B->C->X(1.0)、A->D->X(2.0),X作为A的传递依赖而拥有两个版本,Maven为了解决以上问题,制定了一下规则:
Maven依赖调解第一原则:路径最近者优先。 即:第一条路径的路径长度为3,第二条路径的路径长度为2,则以X(2.0)会被解析使用
Maven依赖调解第二原则:第一声明者优先。即:当两条路径长度相同的时候,在POM中依赖的顺序靠前的会被解析使用。
2.当一个项目有一下依赖关系的时候:A->B、B->X(可选),B->Y(可选) 。根据传递性依赖的规定,如果这三个依赖范围都是compile的,那么A对于X,Y也是compile的,
但是在这里,X,Y都是可选依赖,依赖将不会传递,也就是说,X,Y与A没有任何关系。
使用<optional>声明可选依赖
//<optional>默认为false, //当配置为true的时候,可以理解为表示依赖不向上传递
需要说明的是,设计良好的项目是不应该有可选依赖的,在面向对象的设计中,根据单一职责性原则,一个类,模块应该只有一项职责。针对可选依赖,可以做出如下应对:
对每个有可选依赖的模块单独划分为两个Maven项目,用户根据选择具体使用哪个模块。
这样的好处:
1.避免的可选依赖的不传递性,用户不用再单独的再项目中再次声明依赖
2.符合单一职责原则,用户对他们的依赖的作用更加明确
5.9 最佳实践
1.排除依赖:
当一个项目有一下依赖关系:A->B。但是A只是依赖于B的一部分的时候,有两种方式可以排除对B不需要的部分的传递的依赖:
第一种方式为在B的pom中将B不需要的部分声明为<optional>true</optional>,即可选的,
第二种方式为在A的pom中将B不需要的部分使用
<exclusions> <exclusion> <groupId>x</groupId> <artifactId>x</artifactId> </exclusion> <exclusion> <groupId>y</groupId> <artifactId>y</artifactId> </exclusion> </exclusions>
类似以上的代码声明不需要依赖的B的依赖
2.归类依赖:
使用类似常量代替一类依赖的版本号。比如Spring Framework.这样当依赖升级的时候,只需要修改一处地方就行。
<properties> <springframework.version>2.5.6</springframework.version> </properties>
3.优化依赖
使用
mvn dependency:list
查看当前已解析依赖
使用
mvn dependency:tree
查看当前依赖树
使用
mvn dependency:analyze
查看当前依赖的详细使用情况,
值得注意的是dependency会:
1.使用Used undeclared dependencies 指出当前未声明但是已经使用的依赖,对于这种依赖,我们应该显示声明它。
2.使用Unused declared dependencies 指出当前已声明但是未使用的依赖,对于这种依赖,不能简单的直接删除。若需要直接删除,也必须小心测试后再删除