Maven中dependencyManagement标签的正确使用方法
前言
Maven中的dependencyManagement元素提供了一种管理依赖版本号的方式,她用于声明所依赖的jar包的版本号等信息。当所有子项目再次引入这些jar包时,则无需显式的定义version属性。Maven会沿着父子层级向上寻找拥有dependencyManagement 元素的项目,然后继承它约定的版本号。
使用方法
pom文件中,有两种途径判断jar的版本号。
子项目未声明依赖版本号,则继承父项目中的。如果dependency标签未曾声明version元素,那么maven就会到父项目dependencyManagement标签里面去找该artifactId和groupId 的版本声明信息,如果找到了,就继承它;否则,就会抛出异常,告诉你必须为dependency声明version属性。
子项目定义的依赖版本号优先级高于父项目的。如果dependency标签声明了version属性,那么无论dependencyManagement中有无对该jar的version声明,都以dependency里的为准。
在父项目的POM.xml中配置dependencyManagement标签,定义基本的父依赖。这里仅仅定义一个Junit5的依赖:
<?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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.wiener</groupId>
<artifactId>springBoot</artifactId>
<version>1.0-SNAPSHOT</version>
<modules>
<module>wiener-demo</module>
</modules>
<!--打包方式pom-->
<packaging>pom</packaging>
<properties>
<junit-jupiter.version>5.5.2</junit-jupiter.version>
</properties>
<!-- 版本管理,导入需要的模块-->
<dependencyManagement>
<dependencies>
<!-- junit 5 -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>${junit-jupiter.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
</build>
</project>
在wiener-demo(pom.xml)中定义Junit5依赖:
//子项目实际引用的jar包
<dependencies>
<!-- junit 5 -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
</dependency>
</dependencies>
modules标签中的模块就是项目的子模块,他们都受到父模块的版本约束,但是需要自己导入子模块的依赖。dependencyManagement标签定义项目通用的父依赖,各个依赖的版本号由properties标签定义,通过${变量名}的形式动态获取版本号。
例如,在父依赖中junit5依赖的版本号5.5.2就定义在properties标签中,变量名是junit-jupiter.version,而dependencyManagement标签通过${junit-jupiter.version}导入版本号;在用到Junit5依赖的子模块中,只需声明依赖,无需描述版本信息。
结束语
在顶层pom文件中,通过标签dependencyManagement定义公共的依赖关系,让所有的子项目使用依赖项的统一版本,确保应用的各个项目的依赖项和版本一致,保证测试的和发布的是相同的结果。
这样做的优点是避免在每个子项目里都声明一个版本号,当想升级或切换到另一个版本时,只需要在顶层父容器里更新,而避免逐个修改子项目;另外如果某个子项目需要另外的一个版本,只需要在子项目声明version即可。温馨提示,dependencyManagement标签中定义的只是依赖的声明,并不实现引入,因此子项目需要显式的声明需要用的依赖。
Maven中dependencyManagement标签的正确使用方法的更多相关文章
- Maven 中 dependencyManagement 标签使用
1.在Maven中dependencyManagement的作用其实相当于一个对所依赖jar包进行版本管理的管理器. 2.pom.xml文件中,jar的版本判断的两种途径 1:如果dependenci ...
- Maven中dependencyManagement使用
在Maven中dependencyManagement的作用其实相当于一个对所依赖jar包进行版本管理的管理器. 在dependencyManagement下申明的dependencies,Maven ...
- HTML中<meta>标签如何正确使用
HTML中<meta>标签如何正确使用 如果我们在浏览器中按下F12或者Ctrl+shift+J,便可以打开开发者工具,在element中即可看到<head>元素中有不少< ...
- maven中scope标签详解
前言 最近在做itoo的pom优化工作,发现对于maven依赖管理中的scope标签还是有不明白的地方,所以今天就来总结一下这方面的知识,scope在maven的依赖管理中主要负责项目的部署 mave ...
- MATLAB中fft函数的正确使用方法
问题来源:在阅读莱昂斯的<数字信号处理>第三章离散傅里叶变换时,试图验证实数偶对称信号的傅里叶变换实部为偶对称的且虚部为零.验证失败.验证信号为矩形信号,结果显示虚部是不为零且最大幅值等于 ...
- Struts2中 radio标签的详细使用方法
首先在页面中引入struts标签库: <%@ taglib prefix="s" uri="/struts-tags"%> 在JSP页面中创建单选按 ...
- jar包的多层级maven依赖的坑与正确传递方法
这个问题简述起来就是项目加载jar包但是无法加载jar包的依赖 这是一个maven的特性吗? 问题发生前 程序猿经常自己写一些库实现或收集常用的逻辑方法(算法和设计模式等等),以方便多个项目使用,避免 ...
- Maven中dependencyManagement作用说明
https://blog.csdn.net/helllochun/article/details/81564921 在Maven多模块的时候,管理依赖关系是非常重要的,各种依赖包冲突,查询问题起来非常 ...
- maven中scope标签各个值的意义
在使用maven配置时,有时候会见到scope这个标签,但是总是记不住他们所对应的含义,现在整理一下,以后忘记了再来查看. 版权声明:本文为CSDN博主「MrZhangBaby」的原创文章,遵循 CC ...
- maven中scope标签以及exclusions 记录
scope的分类 1.compile:默认值 他表示被依赖项目需要参与当前项目的编译,还有后续的测试,运行周期也参与其中,是一个比较强的依赖.打包的时候通常需要包含进去 2.test:依赖项目仅仅参与 ...
随机推荐
- win32绘图:绘制直线 矩形 圆形 曲线等
查看代码 #include <Windows.h> //画点 void PaintSetPixel(HDC hdc) { for (short i = 0; i < 20; i++) ...
- git 烂笔头
git 烂笔头 触类旁通, 举一反三, 不求甚解, 欢迎补充 详细介绍 git connect github # 1. 本地配置, 姓名和邮箱 git config --global user.nam ...
- WARN Issues with peer dependencies found,pnpm peer dependencies auto-install
前言 pnpm 也需要设置自动安装对等依赖项 解决 pnpm 使用 npm 的配置格式,所以应该以与 npm 相同的方式设置配置: pnpm config set auto-install-peers ...
- php使用redis锁
redis加锁分类 redis能用的的加锁命令分别是INCR.SETNX.SET 利用predis操作redis方法大全 第一种锁命令INCR 这种加锁的思路是, 当 key 不存在,那么 key 的 ...
- 为什么AI教师难以实现
提供AI应用咨询+陪跑服务,有需要回复1 本周为一家教育公司提供了全天的AI的培训,后续涉及AI+教育领域的项目开发,而我去年就做过AI教师项目,所以对AI+教育有一定熟悉度. 下来后又拜访了一家互联 ...
- 项目实战 TS
项目实战 TS 通用技巧 新手先 any 再填坑,老手先定义数据结构写逻辑 遇到新场景,没把握快速,先用 any 再填坑,填坑的过程也是 TS 技能满满提升的过程. TS 发现潜在问题 1)复杂逻辑, ...
- [每日算法] leetcode第1题:两数之和
leetcode第1题入口 知识点 寻找循环体中目标值之间的关系来减少循环层数 (利用关系建立查找对方的数据结构来空间换时间) 题目描述 给定一个整数数组 nums 和一个整数目标值 target,请 ...
- 【Ubuntu】Ubuntu 24.04 配置镜像源
[Ubuntu]Ubuntu 24.04 配置镜像源 零.起因 最近在虚拟机中安装了个ubuntu-24.04-desktop-amd64,默认是国外的软件源,很慢,故替换到国内. 壹.替换 源地址( ...
- ubuntu16.04安装SQLite
主流的sqlite3,占用内存小,处理时速度快,跨平台. 几乎所有版本的 Linux 操作系统都附带 SQLite.所以,只要使用下面的命令来检查您的机器上是否已经安装了 SQLite. 一.检查是否 ...
- 条件锁存在的意义:用生活中的例子秒懂线程间的"暗号系统"
条件锁存在的意义:用生活中的例子秒懂线程间的"暗号系统" 引子: 在学习linux下c语言中的互斥锁和条件锁的时候,我的大脑哦逻辑进入了"条件锁到底锁了什么"的 ...