读书笔记-《Maven实战》-2018/5/3

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 指出当前已声明但是未使用的依赖,对于这种依赖,不能简单的直接删除。若需要直接删除,也必须小心测试后再删除

原文地址:https://www.cnblogs.com/dengchengchao/p/8985906.html