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.</springframework.version>
</properties>

3.优化依赖

使用

mvn dependency:list

查看当前已解析依赖

使用

mvn dependency:tree

查看当前依赖树

使用

mvn dependency:analyze

查看当前依赖的详细使用情况,

值得注意的是dependency会:

1.使用Used undeclared dependencies 指出当前未声明但是已经使用的依赖,对于这种依赖,我们应该显示声明它。

2.使用Unused declared dependencies 指出当前已声明但是未使用的依赖,对于这种依赖,不能简单的直接删除。若需要直接删除,也必须小心测试后再删除

读书笔记-《Maven实战》-2018/5/3的更多相关文章

  1. AngularJS in Action读书笔记6(实战篇)——bug hunting

    这一系列文章感觉写的不好,思维跨度很大,原本是由于与<Angularjs in action>有种相见恨晚而激发要写点读后感之类的文章,但是在翻译或是阐述的时候还是会心有余而力不足,零零总 ...

  2. 学习笔记——Maven实战(四)基于Maven的持续集成实践

    Martin的<持续集成> 相信很多读者和我一样,最早接触到持续集成的概念是来自Martin的著名文章<持续集成>,该文最早发布于2000年9月,之后在2006年进行了一次修订 ...

  3. 学习笔记——Maven实战(六)Gradle,构建工具的未来?

    Maven面临的挑战 软件行业新旧交替的速度之快往往令人咂舌,不用多少时间,你就会发现曾经大红大紫的技术已经成为了昨日黄花,当然,Maven也不会例外.虽然目前它基本上是Java构建的事实标准,但我们 ...

  4. 学习笔记——Maven实战(七)常用Maven插件介绍(上)

    我们都知道Maven本质上是一个插件框架,它的核心并不执行任何具体的构建任务,所有这些任务都交给插件来完成,例如编译源代码是由maven-compiler-plugin完成的.进一步说,每个任务对应了 ...

  5. 学习笔记——Maven实战(八)常用Maven插件介绍(下)

    我们都知道Maven本质上是一个插件框架,它的核心并不执行任何具体的构建任务,所有这些任务都交给插件来完成,例如编译源代码是由maven- compiler-plugin完成的.进一步说,每个任务对应 ...

  6. 学习笔记-[Maven实战]-第三章:Maven使用入门(1)

    说明:[Maven实战]一书还介绍了怎么样手工创建Maven工程,学习这本书是为了能尽快在工作中使用,就忽略了手工建工程的部分 如果想了解这部分的内容,可以自己看看书 开始: 1.新建一个maven工 ...

  7. (一)《Maven实战》读书笔记 —— Maven简介

    第一章:Maven简介 一.何为Maven? Maven这个词可以翻译为"知识的积累",本书将介绍Maven这一跨平台的项目管理工具.作为Apache组织中的一个个颇为成功的开源项 ...

  8. 学习笔记——Maven实战(一)坐标规划

    坐标是什么?为什么要规划? 坐标是Maven最基本的概念,它就像每个构件的身份证号码,有了它我们就可以在数以千万计的构件中定位任何一个我们感兴趣的构件.举个最简单的例子,如果没有坐标,使用JUnit的 ...

  9. 学习笔记——Maven实战(二)POM重构之增还是删

    重构是广大开发者再熟悉不过的技术,在Martin Fowler的<重构——改善既有代码的设计>一书中,其定义为“重构(名词):对软件内部结构的一种调整,目的是在不改变软件之可察行为前提下, ...

  10. 学习笔记——Maven实战(三)多模块项目的POM重构

    重复,还是重复 程序员应该有狗一般的嗅觉,要能嗅到重复这一最常见的坏味道,不管重复披着怎样的外衣,一旦发现,都应该毫不留情地彻底地将其干掉.不要因为POM不是产品代码而纵容重复在这里发酵,例如这样一段 ...

随机推荐

  1. Shell之StdI/O和Pipe

    目录 Shell之StdI/O和Pipe 参考 StdI/O重定向 Pipe 常用组合 Shell之StdI/O和Pipe

  2. windows下查看进程及结束进程命令

    windows下查看进程及结束进程命令 1)查看占用8080端口的进程号 >netstat –aon | findstr “8080” 结果:TCP    0.0.0.0:8080        ...

  3. Flume 学习笔记之 Flume NG高可用集群搭建

    Flume NG高可用集群搭建: 架构总图: 架构分配: 角色 Host 端口 agent1 hadoop3 52020 collector1 hadoop1 52020 collector2 had ...

  4. 【SpingBoot】spring静态工具类注入问题

    package cn.zwqh.action; import javax.annotation.PostConstruct; import javax.annotation.Resource; imp ...

  5. DOM操作方法、属性

    话不多说直接上demo: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...

  6. go语言正则表达式

    我们前两节课爬取珍爱网的时候,用到了很多正则表达式去匹配城市列表.城市.用户信息,其实除了正则表达式去匹配,还可以利用goquery和xpath第三方库匹配有用信息.而我利用了更优雅的正则表达式匹配. ...

  7. Java序列化总结(最全)

    概念 实现 Serializable 接口, 它只是一个标记接口,不实现也能够进行序列化 RMI: 远程方法调用 RPC: 远程过程调用 序列化ID 解决了序列化与反序列出现代码不一致的问题, 不一致 ...

  8. CSS中的各种单位

    单位 描述                                                                                               ...

  9. Roadmap of FE

    未完待补充......

  10. NoticeBoard

    本人蒟蒻,请轻点虐. 本人是一个即将退役的蒟蒻. 有些题目和模拟赛用密码保护起来了,请小伙伴们不要猜了,猜不出来的.想知道大佬们如果想查看可以直接找我问,您们高抬贵眼会让我受宠若惊. 哇终于有人找我要 ...