本文是系列文章《Maven 源码解析:依赖调解是如何实现的?》第七篇,也是最后一篇,主要做个总结。请按顺序阅读其他系列文章,系列文章总目录参见:hhttps://www.cnblogs.com/xiaoxi666/p/15583241.html

总结

在本系列文章中,我们搭建了一个简单的多模块项目,以实验的形式,从源码角度解析了四种依赖调节原则。涉及到了传递依赖的两种调解原则、一种同文件内的覆盖原则,以及 dependencyManagement 依赖锁定原则。其中,传递依赖的两种调解原则涉及到 NearestConflictResolver 冲突调解器;而同文件内的覆盖原则最简单,就是简单的 Map 覆盖;最后,dependencyManagement 依赖锁定原则稍有些复杂,因为它涉及到了 dependencyManagement 的版本解析,并以解析出来的版本号为准。

在现实工作中,这几种依赖关系可能同时存在。尤其在大型工程中,dependencyManagement 版本锁定运用非常广泛,如果能从源码角度掌握其运行原理,一定会提升你对 Maven 的运用能力。

资源

本文中用到的源码已上传至 Github,地址:https://github.com/xiaoxi666/mavenDependencyDemo,需要的小伙伴请自行下载。

在阅读源码的过程中,我们学到了什么?

首先,我们了解了 Maven 依赖调解实现原理,以后面对各种输出信息,能够做到心中有数。稍微拓展一下,各种依赖管理工具的核心原理其实都差不多,无非就是管理各种依赖版本。希望本文能为你理解包管理工具的实现思路提供些许参考。

其次是设计方面的考量。Maven 提供了核心实现,并且预留了各种扩展点,可以让不同的插件实现不同的功能。这种开发模式可以非常方便功能扩展,对于一款软件的成长是很有利的。业界也有很多采用这种思路开发的产品,比如你熟悉的 Atom。

再说说算法,其实就是很经典的递归算法,以及常提到的备忘录(Map 存储已经解析过的依赖)。

最后,谈谈设计模式的体现。上面提到的源码就有几种,比如模板模式(不同冲突调解器的实现)、访问者模式(参照 visit 方法)、观察者模式(各种 Listener,事件产生时打印一些信息),以及桥接模式(dependency:tree 的实现其实是一个桥,类似于 slf4j 的模式)等等。

当然,你还学会了一种简单方便的 Maven 源码调试方法,哈哈。

参考

《Maven 实战》

Maven 官网:https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html

Maven 依赖调解源码解析(七):总结的更多相关文章

  1. Maven 依赖调解源码解析(一):开篇

    本文是系列文章<Maven 源码解析:依赖调解是如何实现的?>第一篇,主要做个开头介绍.并为后续的实验做一些准备.系列文章总目录参见:https://www.cnblogs.com/xia ...

  2. Maven 依赖调解源码解析(二):如何调试 Maven 源码和插件源码

    本文是系列文章<Maven 源码解析:依赖调解是如何实现的?>第二篇,主要介绍如何调试 Maven 源码和插件源码.系列文章总目录参见:https://www.cnblogs.com/xi ...

  3. Maven 依赖调解源码解析(三):传递依赖,路径最近者优先

    本文是系列文章<Maven 源码解析:依赖调解是如何实现的?>第三篇,主要介绍依赖调解的第一条原则:传递依赖,路径最近者优先.本篇内容较多,也是开始源码分析的第一篇,请务必仔细阅读,否则后 ...

  4. Maven 依赖调解源码解析(四):传递依赖,第一声明者优先

    本文是系列文章<Maven 源码解析:依赖调解是如何实现的?>第四篇,主要介绍依赖调解的第二条原则:传递依赖,第一声明者优先.请按顺序阅读其他系列文章,系列文章总目录参见:https:// ...

  5. Maven 依赖调解源码解析(五):同一个文件内声明,后者覆盖前者

    本文是系列文章<Maven 源码解析:依赖调解是如何实现的?>第五篇,主要介绍同一个文件内声明,后者覆盖前者的原则.请按顺序阅读其他系列文章,系列文章总目录参见:https://www.c ...

  6. Maven 依赖调解源码解析(六):dependencyManagement 版本锁定

    本文是系列文章<Maven 源码解析:依赖调解是如何实现的?>第六篇,主要介绍 dependencyManagement 版本锁定原则.请按顺序阅读其他系列文章,系列文章总目录参见:htt ...

  7. QT源码解析(七)Qt创建窗体的过程,作者“ tingsking18 ”(真正的创建QPushButton是在show()方法中,show()方法又调用了setVisible方法)

    前言:分析Qt的代码也有一段时间了,以前在进行QT源码解析的时候总是使用ue,一个函数名在QTDIR/src目录下反复的查找,然后分析函数之间的调用关系,效率实在是太低了,最近总结出一个更简便的方法, ...

  8. Celery 源码解析七:Worker 之间的交互

    前面对于 Celery 的分布式处理已经做了一些介绍,例如第五章的 远程控制 和第六章的 Event机制,但是,我认为这些分布式都比较简单,并没有体现出多实例之间的协同作用,所以,今天就来点更加复杂的 ...

  9. jQuery 源码解析(七) jQuery对象和DOM对象的互相转换

    jQuery对象是一个类数组对象,它保存的是对应的DOM的引用,我们可以直接用[]获取某个索引内的DOM节点,也可以用get方法获取某个索引内的DOM节点,还可以用toArray()方法把jQuery ...

随机推荐

  1. 常见的==和equals比较

    在笔试上碰到很多这样类似的题,全部整理到这里 String a = "Hello"; String b = "Hello"; String c = new St ...

  2. Spring源码之创建AOP代理之增强器的获取

    前言 在上一篇博文中我们说到了通过自定义配置完成了对AnnotationAwareAspectJAutoProxyCreator类型的自动注册,那么这个类究竟做了什么工作从而完成AOP的操作呢?首先我 ...

  3. oracle dg failover灾难切换

    oracle dg failover灾难切换SQL> alter database recover managed standby database finish force;SQL> a ...

  4. 题解 [HAOI2016]字符合并

    题目传送门 Description 有一个长度为 \(n\) 的 \(01\) 串,你可以每次将相邻的 k 个字符合并,得到一个新的字符并获得一定分数. 得到的新字符和分数由这 k 个字符确定.你需要 ...

  5. Fastjson中getJSONObject()与getJSONArray()的使用

    测试JSON串: { "package": { "List1": { "errorCode": "0", "e ...

  6. 使用ShardingSphere-JDBC完成Mysql的分库分表和读写分离

    1. 概述 老话说的好:选择比努力更重要,如果选错了道路,就很难成功. 言归正传,之前我们聊了使用 MyCat 实现Mysql的分库分表和读写分离,MyCat是服务端的代理,使用MyCat的好处显而易 ...

  7. 浅尝装饰器和AOP

    [写在前面] 参考文章:https://www.cnblogs.com/huxi/archive/2011/03/01/1967600.html[从简单的例子入手进行讲解,由浅入深,很到位] 装饰器部 ...

  8. python jinja2初见

    吸取了长城杯的教训,学习python-web迫在眉睫. 正常难度的python_template_injection,由于现在没学面向对象,理解原理比较困难,所以先使用简单版复现:并附上正常版的常用p ...

  9. pagelayout中边界灵敏度动画时间kv

    <PageLayoutWidget>: # 默认是50dp 设置边界 border:'100dp' # 默认哪一页 page:2 # 设置翻页动画及持续时间 anim_kwargs:{'d ...

  10. Java:ConcurrentHashMap类小记-3(JDK8)

    Java:ConcurrentHashMap类小记-3(JDK8) 结构说明 // 所有数据都存在table中, 只有当第一次插入时才会被加载,扩容时总是以2的倍数进行 transient volat ...