Maven知识点-关于dependencyManagement和pluginManagement

news2024/12/26 22:30:03

前言

dependencyManagement和pluginManagement如何使用以及什么意思?我想懂点Maven的应该都明白,无非是依赖和插件的管理(版本),一般多用于Maven项目的继承和聚合模式中。

这里不是讲解dependencyManagement和pluginManagement的,而是针对这两个元素,记录一个本人发现的问题,理解了这个问题,就可以更有助于依赖和插件的管理。

测试项目,Maven + jdk1.8 + springboot2.6.7

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.6.7</version>
    <relativePath/>
  </parent>

这里我的测试项目结构是
在这里插入图片描述
父pom文件中继承了spring-boot-starter-parent,子模块version-test继承了父pom文件,各自主要pom如下:

<parent>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-parent</artifactId>
  <version>2.6.7</version>
  <relativePath/>
</parent>

<groupId>test.version.maven</groupId>
<artifactId>maven-test</artifactId>
<version>1.0-SNAPSHOT</version>

<name>maven-test</name>

<packaging>pom</packaging>

<modules>
  <module>version-test</module>
</modules>
<parent>
     <groupId>test.version.maven</groupId>
     <artifactId>maven-test</artifactId>
     <version>1.0-SNAPSHOT</version>
     <relativePath>../pom.xml</relativePath>
 </parent>

 <artifactId>version-test</artifactId>
 <version>1.0-SNAPSHOT</version>

 <name>version-test</name>

dependencyManagement

首先在version-test的pom文件中添加junit的依赖(不写version),此时父pom中没有junit的依赖
在这里插入图片描述
项目打包mvn clean install,结果是通过的;这很简单,因为父pom中继承了spring-boot-starter-parent,里面配置了junit依赖以及版本,所以version-test直接继承了下来,具体如下
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
现在继续修改一下,父pom中添加junit的依赖,但是不写version
在这里插入图片描述
再次打包,结果就报错了,为什么呢?因为version-test的依赖junit没写version,就会去父pom中查询,父pom中虽然定义了junit的依赖,但没有定义version,这时候就会报错了,这时候可能有人会有疑问,不是父pom继承了spring-boot-starter-parent吗?是的,虽然是这样,但我们父pom中的junit是定义在dependencyManagement中的,它不会再去自己的父pom中找version了,所以就报错了,报错如下
在这里插入图片描述
当然,你也可以在父pom中的junit追加上version,这样就可以了,不过,既然继承了spring-boot-starter-parent,里面有的我们最好直接使用,不推荐自己再次定义一个一样的依赖,如果需要的依赖只是版本不同,是可以自己定义的。(定义在父pom中还是定义在子模块中视当前情况而定)

总结

自己项目中维护的dependencyManagement

  1. 如果使用继承了spring-boot-starter-parent,人家已经定义的依赖,除非你想使用不同的version,否则子模块直接使用即可,不需要重复定义。
  2. spring-boot-starter-parent中没有的依赖,也就是第三方的依赖,如果定义在dependencyManagement中,需要写明version,否在子模块继承使用的时候不指定version会报错。
  3. 父pom中在dependencyManagement中定义了依赖,子模块也定义了相同的并追加了version,子模块的会覆盖父的。

pluginManagement

其实pluginManagement和dependencyManagement的作用是一样的,但也存在特殊的地方。

依然是上面的项目结构。

我们经常在使用mvn clean install的时候,需要跳过测试环节,所以我们这样执行Maven命令:mvn clean install -Dmaven.test.skip=true

这样是可以的,也有的时候,我们想要直接在父pom中直接全局定义插件执行的时候跳过测试,命令行就可以不追加参数-Dmaven.test.skip=true了,怎么做呢?(关于Maven插件,生命周期和阶段以及它们之间的绑定关系执行顺序等,这里不多解释了,可以看一下《Maven实战》),我们只需要在父pom中添加如下
在这里插入图片描述

pluginManagement中配置了插件maven-surefire-plugin插件的参数skip为true,这时候,我们还需要在子模块引用吗?答案是不要的!!!而且这里我们也没有写version!!!!

可能有些人说,父pom不是继承了spring-boot-starter-parent嘛,肯定里面也定义了插件的版本号,是的,没错,是这样的,但是!!!如果我注释掉了spring-boot-starter-parent呢?
在这里插入图片描述
注意!因为刚才我们在上面dependencyManagement的演示中牵扯到了junit的测试,这里注释掉了spring-boot-starter-parent,junit找不到依赖的version了,所以我们先删除掉junit的依赖。

此时再次执行mvn clean install
在这里插入图片描述
竟然没有报错,跟dependencyManagement不一样啊?

结果不仅配置的插件生效了,而且也成功了,为什么呢?

注意看!这里的插件mven-surefire-plugin的版本号用的是2.12.4,先记住,我们继续往下看。

现在!放开刚才注释的spring-boot-starter-parent,再次打包测试
在这里插入图片描述
也成功了,等等!!!你注意到了嘛?此时插件maven-surefire-plugin的版本号是2.22.2!!!!!

直接说结果和原因吧,这时候插件版本号是继承的spring-boot-starter-parent中的。那么刚才注释掉了spring-boot-starter-parent,为什么还生效呢?原因就是这里
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里面默认定义了jar类型的Maven的生命周期阶段和插件的绑定,插件默认了版本号
在这里插入图片描述
看到了嘛,插件版本号是2.12.4,跟刚才注释掉spring-boot-starter-parent的时候一样,对比一下其他插件你会发现版本号是一致的。

回到刚才的问题

  1. 为什么pluginManagement中的插件maven-surefire-plugin不写版本号不报错呢?因为默认找spring-boot-starter-parent的,没有spring-boot-starter-parent就会使用Maven自己定义好的。
  2. 为什么子模块不引用插件,就生效呢?不像是dependencyManagement那样必须在子模块定义了才可以使用?因为Maven的官方插件,有一些默认绑定好了,你可以像是依赖那样理解它已经存在了,版本也有了,所以父pom中定义不定义,自己都会生效,只不过父pom中定义了参数或版本呢,子的也会继承下来而已;但是如果pluginManagement中定义的是第三方的插件,不写version是会报错的,而且子模块中也必须像dependencyManagement那样定义引用才可以

总结

这篇博客其实需要你具有Maven生命周期方面的知识才能理解彻底,如果不明白的话,还是建议先搞明白生命周期。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/195876.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PCB丝印的字符有哪些作用?

PCB字符也就是行业内常说的“丝印”PCB丝印在一般的PCB板子都可以看到&#xff0c;那么PCB丝印有那些作用呢。 1、大家都知道各种各样的电子元器件数不胜数&#xff0c;那么如何区分PCB这个焊盘是贴什么电子元器件的呢&#xff1f;实际上就是通过PCB板子上的丝印字符去判断每一…

package.json配置详解

npm 介绍 npm 是随同 Node.js 一起安装的包管理工具,能解决 Node.js 代码部署上的很多问题,常见的使用场景有以下几种: 允许用户从 NPM 服务器下载别人编写的第三方包到本地使用;许用户从 NPM 服务器下载并安装别人编写的命令行程序到本地使用;允许用户将自己编写的包或命令行…

【云原生 | Docker 高级篇】11、Docker 私有镜像仓库 Harbor 安装及使用教程

目录 一、Harbor 介绍 二、Harbor 的优势 三、Harbor 部署安装 3.1 部署环境 3.2 为 Harbor 自签发证书 3.3 安装 Harbor 3.4 设置开机自启 四、Harbor 图像化界面使用说明 4.1 修改本地 hosts 文件 4.2 访问 harbor 4.3 创建项目 五、测试使用 harbor 私有镜像仓库…

form 表单只有一个input 时,回车自动提交表单造成页面刷新效果

现象&#xff1a;el-form 中仅有一个input&#xff0c;input上设置了回车响应事件&#xff0c;首次按回车键后&#xff0c;页面刷新&#xff0c;再次按回车才执行了响应事件 <el-form ref"form" submit.native.prevent><el-form-item><el-input keyu…

C#学习记录——【实例】C#实现OPC Client

最近学习测试用C#开发OPC客户端连接OPC服务器&#xff0c;防止遗忘&#xff0c;记录学习测试结果。 1、OPC基础知识 1.1、OPC概述 OPC是Object Linking and Embedding&#xff08;OLE&#xff09;for Process Control 的缩写&#xff0c;它是微软公司的对象链接和嵌入技术在…

【JavaEE】认识HTTP协议

✨哈喽&#xff0c;进来的小伙伴们&#xff0c;你们好耶&#xff01;✨ &#x1f6f0;️&#x1f6f0;️系列专栏:【JavaEE】 ✈️✈️本篇内容:认识HTTP协议、请求。 &#x1f680;&#x1f680;代码存放仓库github&#xff1a;JavaEE仓库&#xff01; ⛵⛵作者简介&#xff1…

Golang 提取视频中音频,存为MP3格式 | Golang工具

目录 前言 环境依赖 代码 总结 前言 本文提供将视频中音频提取出来存为mp3格式&#xff0c;一如既往的实用主义。 主要也是学习一下golang使用ffmpeg工具的方式。 环境依赖 ffmpeg环境安装&#xff0c;可以参考我的另一篇文章&#xff1a;windows ffmpeg安装部署_阿良的博…

Delphi复制HID、ID门禁卡源码

T5557卡是美国Atmel公司生产的多功能非接触式射频芯片卡&#xff0c;属于125KHz的低频卡&#xff0c;在国内有广大的应用市场&#xff0c;如很多酒店的门禁卡都是使用T5557卡。该芯片共有330bit(比特)的EPROM(分布为10个区块, 每个区块33bit)。0页的块0是被保留用于设置T5557操…

模电学习3. MCU接三极管开关电路简单分析

模电学习3. MCU接三极管开关电路简单分析一、说明二、使用NPN型三极管工作状态分析1. 饱和状态基本要求2. 计算限流电阻R23. IbI_bIb​4. 计算 RbR_bRb​5. 下拉电阻三、使用PNP型三极管工作状态分析1. 示例原理图2. IO输出低电平3. IO输出高电平一、说明 本文演示了一个使用M…

adb调试工具-笔记

adb调试工具adb工具可以在电脑通过终端命令操作安卓手机/模拟器命令&#xff1a;adb shell dumpsys window windows | findstr mFocusedApp该命令是查找程序的包名和界面名让我们打开夜神模拟器&#xff0c;并打开设置界面然后在电脑打开命令行&#xff0c;输入上述查询命令传送…

小红书数据分析网站:2023年如何产出爆文(纯干货分享)

导语&#xff1a; 不懂小红书最近火热的赛道、总是错过爆款打造的节奏……2023年了&#xff0c;相信不少人会发现关于小红书营销种草投放&#xff0c;入门容易&#xff0c;做好难。本文将借助第三方工具为品牌锚定赛道&#xff0c;寻找新风向。 1、行业流量大盘 —— 实时掌握…

Android 进程保活(一)

最近公司项目需求&#xff0c;需要给应用加入进程保活。 这里简述一下需求&#xff0c;由于App应用对接了蓝牙接收实时数据&#xff0c;并且数据量很大&#xff1b; 用户在操作App获取实时数据的时候&#xff0c;不可能一直看着手机屏幕&#xff0c; 这时候手机一般会有黑屏或者…

freertos学习之路1-裸机和rtos的区别

写在最前 由于工作需要&#xff0c;需要开始学习freertos的相关知识&#xff0c;本专题主要记录freertos的相关内容 参考&#xff1a; https://www.bilibili.com/video/BV19g411p7UT 正点原子视频 1. 裸机和rtos的多任务处理 试想一种场景&#xff0c;我们正在打游戏&#xff0…

java基础巩固-宇宙第一AiYWM:为了维持生计,大数据之ElasticSearch【ElasticSearch的概念、关于文档、索引的命令】~整起

ElasticSearch一、ElasticSearch基本概念1.ElasticSearch是什么&#xff1f;从哪来、来干啥&#xff1f;2.ElasticSearch与Solr的对比与选型&#xff1a;3.ES核心概念及相关操作4.ELK&#xff1a;拆箱即用的技术&#xff0c;解压完成就能用5.IK分词器6.ElasticSearch与SpringBo…

字节跳动青训营--前端day6

文章目录前言一、React的历史和应用二、React的设计思路1. ui编程痛点 & 对React的期望2. 组件化3.状态归属问题4. 生命周期三、React&#xff08;hooks&#xff09;1.Virtual DOM(虚拟 DOM)&#xff1a;2. diff算法四、React状态管理库五、应用级框架科普前言 仅以此文章…

spark 内存管理机制与相关参数调优

spark 内存管理 文章目录spark 内存管理spark 1.6 内存管理机制spark 2.0 内存管理机制spark 3.3.1 官方文档spark 内存相关参数调优spark 1.6 内存管理机制 https://0x0fff.com/spark-memory-management 统一内存管理 Spark 1.6 之后引入的统一内存管理机制&#xff0c;与静…

SpringbootAdmin:轻量级的Springboot监控组件,用过的都说好

简介 Springboot Admin是一个管理和监控Springboot项目的组件&#xff0c;分为服务端和客户端&#xff0c;两端通过http进行通信。由于其轻量级的特性&#xff0c;所以特别适合中小项目使用。 其效果图如下&#xff1a; 服务端配置 1&#xff0c;引入Springboot admin和Spri…

3.5 异常

1.概述 异常是一些用来封装错误信息的对象 它由异常的类型、提示信息、报错的行号提示三部分组成 2.异常的继承结构 3.异常的处理方式 当程序中遇到了异常,通常有两种处理方式:捕获或者向上抛出 当一个方法抛出异常,调用位置可以不做处理继续向上抛出,也可以捕获处理异常 大…

简单使用OpenGauss数据库

1 参考网站 # OpenGauss官网 https://opengauss.org/zh/2 Docker安装OpenGauss 下载OpenGauss docker pull enmotech/opengauss:3.0.0安装OpenGauss 容器参数说明&#xff1a; GS_PASSWORD&#xff1a;必须设置该参数&#xff0c;该参数设置了openGauss数据库的超级用户omm…

LeetCode 刷题系列 -- 1110. 删点成林

给出二叉树的根节点 root&#xff0c;树上每个节点都有一个不同的值。如果节点值在 to_delete 中出现&#xff0c;我们就把该节点从树上删去&#xff0c;最后得到一个森林&#xff08;一些不相交的树构成的集合&#xff09;。返回森林中的每棵树。你可以按任意顺序组织答案。示…