本文是系列文章《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 依赖调解源码解析(一):开篇的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. Maven 依赖调解源码解析(七):总结

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

  7. SuperSocket源码解析之开篇

    一 简介 官方介绍:SuperSocket 是一个轻量级, 跨平台而且可扩展的 .Net/Mono Socket 服务器程序框架.你无须了解如何使用 Socket, 如何维护 Socket 连接和 S ...

  8. SuperSocket源码解析之开篇 (转)

    一 简介 官方介绍:SuperSocket 是一个轻量级, 跨平台而且可扩展的 .Net/Mono Socket 服务器程序框架.你无须了解如何使用 Socket, 如何维护 Socket 连接和 S ...

  9. Maven 源码解析:依赖调解是如何实现的?

    系列文章目录(请务必按照顺序阅读): Maven 依赖调解源码解析(一):开篇 Maven 依赖调解源码解析(二):如何调试 Maven 源码和插件源码 Maven 依赖调解源码解析(三):传递依赖, ...

随机推荐

  1. 通用脱敏工具类和判断URL

    通用脱敏工具类 public class DesensitizationUtil { private static final int SIZE = 6; private static final S ...

  2. xLua中Lua调用C#

    xLua中Lua调用C# 1.前提 这里使用的是XLua框架,需要提前配置xlua,设置加载器路径: 可以参考之前的Blog:<xlua入门基础>: //调用段,所有的lua代码都写在Lu ...

  3. Go语言核心36讲(Go语言基础知识四)--学习笔记

    04 | 程序实体的那些事儿(上) 还记得吗?Go 语言中的程序实体包括变量.常量.函数.结构体和接口. Go 语言是静态类型的编程语言,所以我们在声明变量或常量的时候,都需要指定它们的类型,或者给予 ...

  4. MySQL8 根据某属性查询字段排名由自定义变量到rank()的变动

    在mysql8 之前的版本,因为没有rank()方法的存在,所以在对字段进行排名时,使用的是自定义自变量的方法,比如: select id,name,@rank=@rank+1 as ranks fr ...

  5. spring boot log4j2 最佳实践

    为什么选择 log4j2 Log4j2 使用了 LMAX Disruptor 库.在多线程场景中,异步 Logger 的吞吐量比 Log4j 1.x 和 Logback 高 18 倍,延迟低几个数量级 ...

  6. 工作3年的Java程序员,轻松拿到阿里P6Offer,只因为他搞明白了Redis这几个问题!!

    Redis中的多路复用模型 Redis6用到了多线程?那多线程应用在哪些地方,引入多线程后,又改如何保证线程安全性呢? 同时,如何在性能和线程安全性方面做好平衡? 关于Redis的单线程模型 在Red ...

  7. Java 读取PDF中的表格

    一.概述 本文以Java示例展示读取PDF中的表格的方法.这里导入Spire.PDF for Javah中的jar包,并使用其提供的相关及方法来实现获取表格中的文本内容.下表中整理了本次代码使用到的主 ...

  8. Kali安装OWASP

    我是2019版的kali,里面并没有自带OWASP工具,因为OWASP不再更新的因素,所以新版kali将它移除了  安装OWASP apt-get install zaproxy #以下都是安装软件时 ...

  9. 4个实验,彻底搞懂TCP连接的断开

    前言 看到这个标题你可能会说,TCP 连接的建立与断开,这个我熟,不就是三次握手与四次挥手嘛.且慢,脑海中可以先尝试回答这几个问题: 四次挥手是谁发起的? 如果断电/断网了连接会断开吗? 什么情况下没 ...

  10. Asp.CAore往Vue前端传application/octet-stream类型文件流

    题外话:当传递文件流时要确定文件流的类型,但也有例外就是application/octet-stream类型,主要是只用来下载的类型,这个类型简单理解意思就是通用类型类似 var .object.ar ...