首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

Maven 依赖树的解析规则

对于 Java 开发工程师来说,Maven依赖管理和代码构建的标准。遵循「约定大于配置」理念。Maven 是 Java 开发工程师日常使用的工具,本篇文章简要介绍一下 Maven依赖解析。...依赖树结构 在 pom.xml 的 dependencies 中声明依赖包后,Maven 将直接引入依赖,并通过解析直接依赖的 pom.xml 将传递性依赖导入到当前项目,最终形成一个树状的依赖结构。...针对这种多个版本构建依赖时,Maven 采用「短路径优先」原则,即 A 会依赖 2.0 版本的 E。如果想引入 1.0 版本的 E,需要直接在 A 的 pom 中声明 E 的版本。...依赖排除 我们可以使用 exclusion 来解决依赖冲突,但是 exclusion 会降低 Maven 依赖解析的效率,因为对应的 pom 文件不能缓存,每次都要重新遍历子树。...[2020-11-07-103350.png] Maven 命令行 mvn dependency:tree -Dverbose

2.9K40

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

前言 相信久经沙场的 Java 开发同学们,一定对 Maven 这个工具不陌生。Maven依赖调解原则,便是经常聊到的话题。...的配套核心依赖 dependency:tree,包括两个项目: maven-dependency-plugin-2.8(源码下载:https://archive.apache.org/dist/...dependency:tree 是 Maven 的核心依赖插件,它在依赖解析时发挥重要作用,平时我们也经常使用命令 mvn dependency:tree 输出目录树进行查看。...这个插件由两部分组成,分别是 maven-dependency-plugin 和 maven-dependency-tree;前者包含了与「依赖」相关的多种插件,其中就包括 tree 插件;后者则是 tree...为了进行实验,我们需要搭建一个 Demo 项目,并用 Maven 管理依赖包。该项目名称为 mavenDependencyDemo,我们在其中创建五个模块 A、B、C、D、X。

47221

Maven构建和依赖管理解析

依赖管理在之前的传统 WEB 项目中,所依赖的 JAR 包都要复制到工程中,这就导致了工程比较大。...Maven 的解决方案:在 Maven 工程中,是不直接把 JAR 包直接导入到工程中的,其通过在 pom.xml 文件中添加所需的 JAR 包坐标来解决问题。...clean:主要处理项目构建后的清理工作site:主要处理项目的站点文档生成default 生命周期包含了右图的这些阶段compile 命令:下载所有当前项目所需要的插件,以及所有依赖的项目,然后进行构建...package 命令:从 pom 文件中获取打包类型,然后将打出来的 JAR 输出到对应目录install 命令:将打包完放在 target 目录下的 JAR 包部署到本地仓库POMpom.xm元素解析...project 这个元素是Maven的pom.xml文件的顶层元素。

13600

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

场景 A有这样的依赖关系:A->B->C->X(1.0)、A->D->X(2.0),X是A的传递性依赖,但是两条依赖路径上有两个版本的X,那么哪个X会被Maven解析使用呢?...两个版本都被解析显然是不对的,因为那会造成依赖重复,因此必须选择一个。根据路径最近者优先原则,该例中X(1.0)的路径长度为3,而X(2.0)的路径长度为2,因此X(2.0)会被解析使用。...也就是说,apache-maven-3.6.3 这个核心项目已经做出了「应该保留哪个依赖」的判断。 因此我们再次中断调试,回到 apache-maven-3.6.3 核心项目重新调试。...,让我们看看: 其实很容易发现,依赖解析过程就是一种深度遍历,这里的 recurse 方法会被不断递归。...小结 至此,我们已经知道了路径最近者优先原则的运行原理:依赖解析是一种深度遍历的过程,每当解析一个依赖后,均会将其放到 resolvedArtifacts 这个Map中,后续再看到同名的依赖时,进行冲突调解

52330

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

简单翻译一下,使用 dependencyManagement 声明的依赖若指定了版本,可以: 指定传递依赖的版本(即使传递依赖有自定义版本,也会被覆盖掉); 当直接依赖没有指定版本时,指定其版本...那回到 Maven 核心项目,看看 includeArtifact 方法被哪里调用了: 继续顺着调用链往上找, 看到很奇怪的现象,C 依赖的 X 变成 2.0 版本了,但是 C 中明明是 X(1.0...可以看到,解析 C 依赖的 X(1.0)时,被“manage”了,也即:版本被改成了 2.0。 很明显,版本号是以 managedVersions 为准的。...最终我们找到了这里: 至此,我们找到了「解析 dependencyManagement 中定义的依赖版本」的源码。...小结 依赖解析过程中,会解析 dependencyManagement 定义的依赖版本,如果解析到了,会以 dependencyManagement 重定义的依赖版本为准,也就是我们常提到的版本锁定。

71830

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

因此我们需要以调试方式启动 Maven 源码,以便让流程继续走下去。 打开 apache-maven-3.6.3 项目,新建一个远程调试配置,端口选择 8000。如下图所示。...以调试方式启动 Maven 源码(你可以在入口处打个断点),就会发现流程走进来了。如下图所示。 然后我们就可以愉快地进行调试了。...注 1:本文以 Maven 核心源码为例介绍了调试流程,其实 Maven 插件的源码调试方法也是一模一样的。...注 2:这种调试的方法很灵活,我们可以随便选择不同的业务项目,与 Maven 源码进行联调。当然也有很多调试 Maven 源码的方法,但要设置一大堆东西。...搞清楚如何调试 Maven 和插件源码后,我们就可以开始正式分析了。

80931

maven: 打包可运行的jar包(java application)及依赖处理

IDE环境中,可以直接用exec-maven-plugin插件来运行java application,类似下面这样: 1 2 org.codehaus.mojo...环境,只能用 java -jar xxx.jar这种方式来运行,下面是一些处理细节: 一、依赖的处理 java application运行时需要查找依赖的第三方jar,如果查找classpath失败,...就会报错,可以先用 mvn dependency:copy-dependencies -DoutputDirectory=target/lib 命令,把依赖的jar包全部导出到target/lib这个目录下...Main-Class: ctas.importer.reader.app.Program 7 Archiver-Version: Plexus Archiver 其中第4行指定了classpath,也就是所依赖的...> 15 第7行指定Main-Class,第9行指定classpath的相对路径,这样mvn package后,清单文件里就会自动添加Main-Class和Class-Path这二

1.9K90

Maven - 全面解析 Maven BOM (Bill of Materials):打造高效依赖管理与模块化开发

What’s BOM BOM(Bill of Materials) 是由Maven提供的功能,它通过定义一整套相互兼容的jar包版本集合,使用时只需要依赖该BOM文件,即可放心的使用需要的依赖jar包...1.1版本; 项目C 1.2依赖项目D 1.3版本; 在该例中,项目A对于项目D的依赖就会出现冲突,按照maven dependency mediation的规则,最后生效的可能是:项目A中会依赖到项目...D1.1版本(就近原则,取决于路径和依赖的先后,和Maven版本有关系)。...每个项目(如果支持此功能)都提供自己的bom文件,并管理其相关依赖的版本。 Spring、SpringBoot、SpringCloud自身都采用了此机制来解决第三方包的冲突 ...." xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0

77020

解决Maven在pom.xml配置依赖IntelliJ IDEA无代码提示的方法

在开发Java项目时,我们通常会使用Maven来管理项目的依赖。然而,有时在配置了pom.xml文件后,我们可能会遇到IntelliJ IDEA无法提供代码提示的情况。...install命令,以确保依赖被正确下载和安装。...刷新Maven项目:打开IntelliJ IDEA,在右上角的"Maven Projects"工具窗口中,点击刷新按钮。这将重新加载所有的Maven项目。...经过以上步骤,应该能够解决IntelliJ IDEA无代码提示的问题。现在,你应该能够在编辑器中获得有关添加的依赖的代码提示和自动补全功能。...总结:通过正确配置pom.xml文件,执行clean和install命令安装依赖,然后刷新Maven项目或执行Reimport操作,我们可以解决IntelliJ IDEA无代码提示的问题。

1K10

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

场景 路径最近者优先原则不能解决所有问题,比如这样的依赖关系:A-> C->X(1.0)、A->D->X(2.0),X(1.0)和 X(2.0)的依赖路径长度是一样的,都为 2。...那么到底谁会被解析使用呢?...在 Maven 2.0.8 及之前的版本中,这是不确定的,但是从 Maven 2.0.9 开始,为了尽可能避免构建的不确定性,Maven 定义了依赖调解的第二原则:第一声明者优先。...在依赖路径长度相等的前提下,在 POM 中依赖声明的顺序决定了谁会被解析使用,顺序最靠前的那个依赖优胜。该例中,C 的依赖声明在 D 之前,那么 X(1.0)就会被解析使用。..." xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0

49220
领券