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

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

场景
这次我们让 A 直接依赖 X,且在 A 的 pom.xml 中声明两次 X,分别为 1.0 和 2.0 版本。内容如下:

mavenDependencyDemo org.example 1.0 4.0.0A 1.0 org.example X 1.0 org.example X 2.0


源码
这个比较简单,不涉及调解器,我们直接对着图看一下主流程:
Maven|Maven 依赖调解源码解析(五)(同一个文件内声明,后者覆盖前者)
文章图片

Maven|Maven 依赖调解源码解析(五)(同一个文件内声明,后者覆盖前者)
文章图片

Maven|Maven 依赖调解源码解析(五)(同一个文件内声明,后者覆盖前者)
文章图片

Maven|Maven 依赖调解源码解析(五)(同一个文件内声明,后者覆盖前者)
文章图片

Maven|Maven 依赖调解源码解析(五)(同一个文件内声明,后者覆盖前者)
文章图片

Maven|Maven 依赖调解源码解析(五)(同一个文件内声明,后者覆盖前者)
文章图片

Maven|Maven 依赖调解源码解析(五)(同一个文件内声明,后者覆盖前者)
文章图片

Maven|Maven 依赖调解源码解析(五)(同一个文件内声明,后者覆盖前者)
文章图片

Maven|Maven 依赖调解源码解析(五)(同一个文件内声明,后者覆盖前者)
文章图片

Maven|Maven 依赖调解源码解析(五)(同一个文件内声明,后者覆盖前者)
文章图片

Maven|Maven 依赖调解源码解析(五)(同一个文件内声明,后者覆盖前者)
文章图片


小结
从源码可以看到,如果在同一个 pom 文件内,声明了两个 groupId 和 artifactId 完全相同的依赖,则会以最后一个声明的以来为准。因为在实现层面,它们是保存在 Map 中的,后一个依赖会把前一个依赖覆盖掉。这也印证了该原则的名称:同一个文件内声明,后者覆盖前者。

其实,控制台已经输出了警告,如果你仔细观察的话就会发现:
Maven|Maven 依赖调解源码解析(五)(同一个文件内声明,后者覆盖前者)
文章图片

对应的源码在这里:
Maven|Maven 依赖调解源码解析(五)(同一个文件内声明,后者覆盖前者)
文章图片
【Maven|Maven 依赖调解源码解析(五)(同一个文件内声明,后者覆盖前者)】

    推荐阅读