Maven 依赖调解源码解析(一):开篇
本文是系列文章《Maven 源码解析:依赖调解是如何实现的?》第一篇,主要做个开头介绍。并为后续的实验做一些准备。系列文章总目录参见:https://www.cnblogs.com/xiaoxi666/p/15583241.html。
前言
相信久经沙场的 Java 开发同学们,一定对 Maven 这个工具不陌生。Maven 的依赖调解原则,便是经常聊到的话题。它是为了解决 groupId 和 artifactId 完全相同的依赖,应该取哪个版本号的问题。
下面列举出一些原则:
原则一:传递依赖,路径最近者优先。
原则二:传递依赖,第一声明者优先。
原则三:同一个文件内声明,后者覆盖前者。又称作:同名覆盖。
原则四:dependencyManagement 版本锁定。
以上这些原则,你一定都知道,但你清楚 Maven 源码是如何实现它们的吗?
废话不多说,让我们准备进行实现,到 Maven 的源码世界逛逛!
实验环境
JDK 1.8
apache-maven-3.6.3(源码下载:https://archive.apache.org/dist/maven/maven-3/)
Maven3.6.3 的配套核心依赖 dependency:tree,包括两个项目:
maven-dependency-plugin-2.8(源码下载:https://archive.apache.org/dist/maven/plugins/)
maven-dependency-tree-2.1(源码下载:https://archive.apache.org/dist/maven/shared/)



简单说明一下:
apache-maven-3.6.3 包含了 Maven 的核心代码,以及调用各种插件的入口。
dependency:tree 是 Maven 的核心依赖插件,它在依赖解析时发挥重要作用,平时我们也经常使用命令 mvn dependency:tree 输出目录树进行查看。这个插件由两部分组成,分别是 maven-dependency-plugin 和 maven-dependency-tree;前者包含了与「依赖」相关的多种插件,其中就包括 tree 插件;后者则是 tree 的具体实现。
为了进行实验,我们需要搭建一个 Demo 项目,并用 Maven 管理依赖包。该项目名称为 mavenDependencyDemo,我们在其中创建五个模块 A、B、C、D、X。结构如下:
.
├── A
│ ├── pom.xml
├── B
│ ├── pom.xml
├── C
│ ├── pom.xml
├── D
│ ├── pom.xml
├── X
│ ├── pom.xml
├── pom.xml
后面我们会在分析每条原则时,修改不同模块的依赖。
Maven 依赖调解源码解析(一):开篇的更多相关文章
- Maven 依赖调解源码解析(二):如何调试 Maven 源码和插件源码
本文是系列文章<Maven 源码解析:依赖调解是如何实现的?>第二篇,主要介绍如何调试 Maven 源码和插件源码.系列文章总目录参见:https://www.cnblogs.com/xi ...
- Maven 依赖调解源码解析(三):传递依赖,路径最近者优先
本文是系列文章<Maven 源码解析:依赖调解是如何实现的?>第三篇,主要介绍依赖调解的第一条原则:传递依赖,路径最近者优先.本篇内容较多,也是开始源码分析的第一篇,请务必仔细阅读,否则后 ...
- Maven 依赖调解源码解析(四):传递依赖,第一声明者优先
本文是系列文章<Maven 源码解析:依赖调解是如何实现的?>第四篇,主要介绍依赖调解的第二条原则:传递依赖,第一声明者优先.请按顺序阅读其他系列文章,系列文章总目录参见:https:// ...
- Maven 依赖调解源码解析(五):同一个文件内声明,后者覆盖前者
本文是系列文章<Maven 源码解析:依赖调解是如何实现的?>第五篇,主要介绍同一个文件内声明,后者覆盖前者的原则.请按顺序阅读其他系列文章,系列文章总目录参见:https://www.c ...
- Maven 依赖调解源码解析(六):dependencyManagement 版本锁定
本文是系列文章<Maven 源码解析:依赖调解是如何实现的?>第六篇,主要介绍 dependencyManagement 版本锁定原则.请按顺序阅读其他系列文章,系列文章总目录参见:htt ...
- Maven 依赖调解源码解析(七):总结
本文是系列文章<Maven 源码解析:依赖调解是如何实现的?>第七篇,也是最后一篇,主要做个总结.请按顺序阅读其他系列文章,系列文章总目录参见:hhttps://www.cnblogs.c ...
- SuperSocket源码解析之开篇
一 简介 官方介绍:SuperSocket 是一个轻量级, 跨平台而且可扩展的 .Net/Mono Socket 服务器程序框架.你无须了解如何使用 Socket, 如何维护 Socket 连接和 S ...
- SuperSocket源码解析之开篇 (转)
一 简介 官方介绍:SuperSocket 是一个轻量级, 跨平台而且可扩展的 .Net/Mono Socket 服务器程序框架.你无须了解如何使用 Socket, 如何维护 Socket 连接和 S ...
- Maven 源码解析:依赖调解是如何实现的?
系列文章目录(请务必按照顺序阅读): Maven 依赖调解源码解析(一):开篇 Maven 依赖调解源码解析(二):如何调试 Maven 源码和插件源码 Maven 依赖调解源码解析(三):传递依赖, ...
随机推荐
- 4.自定义类加载器实现及在tomcat中的应用
了解了类加载器的双亲委派机制, 也知道了双亲委派机制的原理,接下来就是检验我们学习是否扎实了,来自定义一个类加载器 一. 回顾类加载器的原理 还是这张图,类加载器的入口是c++调用java代码创建了J ...
- 程序员微机课系列—我的nodejs多版本管理方法
nodejs的多版本配置对于我来说一直都是一个较为头疼的事情.本人的开发工作会涉及electron以及前端,对于工作中使用的npm包(点名node-sqlite3和node-sass)在某些情况下,会 ...
- Jave Hbase AP
Hbase API 类和数据模型的对应关系 HBaseAdmin 类:org.apache.hadoop.hbase.client.HBaseAdmin 作用:提供了一个接口来管理 HBase 数据库 ...
- 洛谷2805 [NOI2009]植物大战僵尸 (拓扑排序+最小割)
坚决抵制长题面的题目! 首先观察到这个题目中,我们会发现,我们对于原图中的保护关系(一个点右边的点对于这个点也算是保护) 相当于一种依赖. 那么不难看出这个题实际上是一个最大权闭合子图模型. 我们直接 ...
- 力扣 - 剑指 Offer 29. 顺时针打印矩阵
题目 剑指 Offer 29. 顺时针打印矩阵 思路1 其实就是按照理解题目的意思一步步从外层到内层打印出来,同时将一个外层分成四个部分分步打印 可以用一个变量count来维护当前打印的第几层 判断打 ...
- (翻译)领域驱动设计实现-Implementing Domain Driven Design
简介 Implementing Domain Driven Design 领域驱动设计实现 A practical guide for implementing the Domain Driven D ...
- DOS命令和快捷键
- HTML中的emment
emment的优点和使用方法: 优点:Emment是前端开发者必备的工具,使用它可以大大提高前端开发效率. 使用方法:Emment的使用方法非常简单,直接在编辑器上输入HTML和CSS代码的缩写,然后 ...
- [软工顶级理解组] Beta阶段测试报告
在测试过程中发现了多少Bug? 测试阶段发现并已修复的bug: 尚且存在,但是难以解决或者不影响使用的bug: 计算重修课程的时候,如果重修课程的课程号和原课程号不同,则GPA计算会出现误差.但我们无 ...
- the Agiles Scrum Meeting 博客汇总
the Agiles 团队博客目录 一.Scrum Meeting 1. Alpha the Agiles Scrum Meeting 1 the Agiles Scrum Meeting 2 the ...