Maven项目中的依赖管理——dependencyManagement
在使用 Maven 创建多模块项目的时候,在父项目的 pom 文件中经常会碰见 <dependencyManagement>
标签的使用,比如如下代码:
<dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Finchley.SR2</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>
那么它的作用究竟是什么呢?我们直接把标签名翻译过来,其意思为“依赖管理”,是的,它在 Maven 中提供了一种管理依赖版本号的方式。
在常规使用中,一个 Maven 项目如果要引用某个依赖,那么直接就在 dependencies 中添加 dependency 描述所需的依赖坐标信息即可完成。这样就达到了一个要什么,就直接写什么的效果,决定权都在是否用 dependency 指定了引用构件的坐标。
但在实际项目管理过程中,会有多个模块,如果把这些模块所需的依赖各自引入,不仅会导致管理的不方便,更甚会有版本冲突等问题,所以此时应该设计一个全局的依赖管理。也就是说,把整个项目要引用的依赖,事先分析整理好,形成一个全局的集合。当某个 Maven 模块需要具体引用某依赖的时候,直接在集合中指定若干个。这样就可以实现整个项目依赖的全局管理,不至于零碎地分布在每个 Maven 模块中。
正是基于这样的考虑,就产生 dependencyManagement 的设计,在此标签元素中声明所需依赖的版本号等信息,那么所有子项目再次引入此依赖 jar 包时则无需显式的列出版本号。Maven 会沿着父子层级向上寻找拥有 dependencyManagement 元素的项目,然后使用它指定的版本号。
例如,在父项目中的 pom.xml 如下:
<properties><springframework.version>1.2.3.RELEASE</springframework.version>
</properties>
<dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>${springframework.version}</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>
此配置即声明了 Spring Boot 的版本信息,注意其中还有 type(打包类型) 和 scope 标签,import 表示当前项目的依赖可用于另外一个项目,并且 import 范围只有在 denpendencyManagement 元素下才有效果,由于其范围有特殊性,一般都是指向打包类型为 pom 的模块。
如果某子项目中需要使用上述的依赖,直接引入即可,并且不必再指定版本号,它会自动继承父类的版本信息。子项目的 pom.xml 如下:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
注意:
- 父项目中的 dependencyManagement 中定义的只是依赖的声明,并不实现引入,因此子项目需要显式的声明需要用的依赖。
- 如果子项目重新指定了依赖的版本号,那么它会引入一个新的依赖而不是从父项目继承。
- scope=import 只能用在 dependencyManagement 里面,且仅用于 type=pom 的 dependency。
dependencies 和 dependencyManagement 的不同:
- 父项目中使用 dependencies 引入依赖,子项目会自动继承父项目中的全部依赖项(全部继承);
- 父项目中使用 dependencyManagement 声明依赖,并不会引入依赖,子项目需要时再引入。
dependencyManagement 的优势:
- 如果有多个子项目都引用同一样依赖,则可以避免在每个使用的子项目里都声明一个版本号;
- 当想升级或切换到另一个版本时,只需要在顶层父容器里更新,而不需要逐个修改子项目;
- 另外如果某个子项目需要另外的一个版本,只需要声明 version 即可。
作者信息
大家好,我是 CoderGeshu,一个热爱生活的程序员,如果这篇文章对您有所帮助,别忘了点赞收藏哦
另外,欢迎大家点击关注
Maven项目中的依赖管理——dependencyManagement相关推荐
- IDEA maven项目中刷新依赖的两种方法
前言 IDEA maven项目中刷新依赖分为自动刷新 和 手动刷新 两种! 自动刷新: File-Settings 手动刷新:
- maven项目中 把依赖的jar包一起打包
2019独角兽企业重金招聘Python工程师标准>>> Maven1-HelloWorld简单入门 使用Maven Assembly plugin将依赖打包进jar 1.pom.xm ...
- 如何解决偶然Maven项目中导入依赖,却一直报错,unresolved dependency
问题描述 之前都是好好的,没什么问题 在我进行导入依赖之后,一直标红 问题解决 确定公司id,项目id和版本号都没写错 找到maven本地仓库,如果没有修改过就在C:\用户:admin.m2\repo ...
- boot项目中pom依赖已经删除了但是maven上还是报红线_Java Web项目是怎么跑起来的?...
良心公众号 关注不迷路 01 简单Java程序的启动过程 在之前的HelloWorld是怎么跑起来的?一文中,我们一起学习了IDE执行简单的Java程序的过程.可以总结为如下三个步骤: 首先,将程序通 ...
- 在maven项目中解决第三方jar包依赖的问题
在maven项目中解决第三方jar包依赖的问题 参考文章: (1)在maven项目中解决第三方jar包依赖的问题 (2)https://www.cnblogs.com/nuccch/p/6122938 ...
- 如何查看Maven项目中的jar包依赖树情况?
对于开发人员,我想大家对于Maven应该不会陌生吧,如何在一个Maven项目中对这个项目中所引用的第三方jar包有个直观的了解呢? 其实实现很简单,只需要借助于Maven的一条命令,如下所示: mvn ...
- maven项目引入新依赖问题
title: maven项目引入新依赖问题 tags: Maven categories: 工作日志 date: 2017-05-25 18:18:55 前一篇描述过关于版本号没有写明确,写了rele ...
- GitChat · 软件工程 | 一小时教你学会 Maven 项目的构建与管理
GitChat 作者:梁鹏举 原文: 一小时教你学会 Maven 项目的构建与管理 关注公众号:GitChat 技术杂谈,一本正经的讲技术 Maven翻译成中文是"专家.内行".M ...
- es6 依赖循环_探索 JavaScript 中的依赖管理及循环依赖
我们通常会把项目中使用的第三方依赖写在 package.json 文件里,然后使用 npm .cnpm 或者 yarn 这些流行的依赖管理工具来帮我们管理这些依赖.但是它们是如何管理这些依赖的.它们之 ...
最新文章
- c语言错误的等式,C语言学习中几个常见典型错误分析.docx
- C++找到一个大于或等于n且为2的幂的数字p的算法实现(附完整源码)
- Python调用ansible API系列(一)获取资产信息
- linux多选项菜单脚本,linux shell 编写菜单脚本事例
- 腾讯优图、AI Lab招聘计算机视觉算法工程师
- python与数学关系大吗_通过一个简单的数学游戏,清晰了解各大编程语言之间的一些区别...
- 深度|数据库产品如何选型?掌握这一招就够了
- 升级AndrOid4.3,谷歌发布Android 4.3系统 今日开始升级
- 使用ExtJs实现文件下载
- 整数划分之四 【区间dp】讲解于思考方法
- 模块二 会务现场服务策划方案 案例1样本
- 使用晨曦记账本记账,将账目明细导出excel表格上
- 华为折叠手机是鸿蒙系统吗,华为发布新一代折叠屏手机 将首批升级鸿蒙系统...
- 计算机表格斜杠怎么打,【2人回答】Excel表格中如何输入斜杠?-3D溜溜网
- 菩萨蛮 生如夏花(赵敏)
- LaTeX中实心圆点列表的一点经验
- pid倒立摆matlab,基于MATLAB的直线一级倒立摆的PID控制研究
- Linux基础命令实例
- 安全牛:安全与业务不存在平衡 证明价值是关键
- 使用Markdown语法介绍markdown
热门文章
- linux下quota实现用户的硬盘配额
- vue降低cli版本错误 ERROR: ~/.vuerc may be outdated. Please delete it and re-run vue-cli in manual mode
- 在WINCC中使用自定义的动画效果控件ocx
- 无法完成请求,因为某种原因阻止文本引擎进行初始化
- C# excel文件导入导出
- Word怎么批量更改字体颜色?
- 提交MapReduce任务出错:unknown queue: default
- 微信小程序复杂条件判断按钮显示隐藏
- 外服玩WOW,必备英语词汇
- Python 获取二维数组的某一列