写点什么

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

作者:xiaoxi666
  • 2021 年 11 月 20 日
  • 本文字数:785 字

    阅读完需:约 3 分钟

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

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


场景

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

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0"         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">    <parent>        <artifactId>mavenDependencyDemo</artifactId>        <groupId>org.example</groupId>        <version>1.0</version>    </parent>    <modelVersion>4.0.0</modelVersion>
<artifactId>A</artifactId> <version>1.0</version>
<dependencies>
<dependency> <groupId>org.example</groupId> <artifactId>X</artifactId> <version>1.0</version> </dependency>
<dependency> <groupId>org.example</groupId> <artifactId>X</artifactId> <version>2.0</version> </dependency>

</dependencies>
</project>
复制代码

源码

这个比较简单,不涉及调解器,我们直接对着图看一下主流程:













小结

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


其实,控制台已经输出了警告,如果你仔细观察的话就会发现:


对应的源码在这里:


发布于: 4 小时前阅读数: 10
用户头像

xiaoxi666

关注

一枚后端coder,一起来玩儿一起学! 2017.11.09 加入

博客园:http://www.cnblogs.com/xiaoxi666/ GitHub : https://github.com/xiaoxi666 微信公众号:xiaoxi666

评论

发布
暂无评论
Maven 依赖调解源码解析(五):同一个文件内声明,后者覆盖前者