在使用 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>

注意

  1. 父项目中的 dependencyManagement 中定义的只是依赖的声明,并不实现引入,因此子项目需要显式的声明需要用的依赖。
  2. 如果子项目重新指定了依赖的版本号,那么它会引入一个新的依赖而不是从父项目继承。
  3. scope=import 只能用在 dependencyManagement 里面,且仅用于 type=pom 的 dependency。

dependencies 和 dependencyManagement 的不同

  1. 父项目中使用 dependencies 引入依赖,子项目会自动继承父项目中的全部依赖项(全部继承);
  2. 父项目中使用 dependencyManagement 声明依赖,并不会引入依赖,子项目需要时再引入。

dependencyManagement 的优势

  1. 如果有多个子项目都引用同一样依赖,则可以避免在每个使用的子项目里都声明一个版本号;
  2. 当想升级或切换到另一个版本时,只需要在顶层父容器里更新,而不需要逐个修改子项目;
  3. 另外如果某个子项目需要另外的一个版本,只需要声明 version 即可。

作者信息

大家好,我是 CoderGeshu,一个热爱生活的程序员,如果这篇文章对您有所帮助,别忘了点赞收藏哦

另外,欢迎大家点击关注

Maven项目中的依赖管理——dependencyManagement相关推荐

  1. IDEA maven项目中刷新依赖的两种方法

    前言 IDEA maven项目中刷新依赖分为自动刷新 和 手动刷新 两种! 自动刷新: File-Settings 手动刷新:

  2. maven项目中 把依赖的jar包一起打包

    2019独角兽企业重金招聘Python工程师标准>>> Maven1-HelloWorld简单入门 使用Maven Assembly plugin将依赖打包进jar 1.pom.xm ...

  3. 如何解决偶然Maven项目中导入依赖,却一直报错,unresolved dependency

    问题描述 之前都是好好的,没什么问题 在我进行导入依赖之后,一直标红 问题解决 确定公司id,项目id和版本号都没写错 找到maven本地仓库,如果没有修改过就在C:\用户:admin.m2\repo ...

  4. boot项目中pom依赖已经删除了但是maven上还是报红线_Java Web项目是怎么跑起来的?...

    良心公众号 关注不迷路 01 简单Java程序的启动过程 在之前的HelloWorld是怎么跑起来的?一文中,我们一起学习了IDE执行简单的Java程序的过程.可以总结为如下三个步骤: 首先,将程序通 ...

  5. 在maven项目中解决第三方jar包依赖的问题

    在maven项目中解决第三方jar包依赖的问题 参考文章: (1)在maven项目中解决第三方jar包依赖的问题 (2)https://www.cnblogs.com/nuccch/p/6122938 ...

  6. 如何查看Maven项目中的jar包依赖树情况?

    对于开发人员,我想大家对于Maven应该不会陌生吧,如何在一个Maven项目中对这个项目中所引用的第三方jar包有个直观的了解呢? 其实实现很简单,只需要借助于Maven的一条命令,如下所示: mvn ...

  7. maven项目引入新依赖问题

    title: maven项目引入新依赖问题 tags: Maven categories: 工作日志 date: 2017-05-25 18:18:55 前一篇描述过关于版本号没有写明确,写了rele ...

  8. GitChat · 软件工程 | 一小时教你学会 Maven 项目的构建与管理

    GitChat 作者:梁鹏举 原文: 一小时教你学会 Maven 项目的构建与管理 关注公众号:GitChat 技术杂谈,一本正经的讲技术 Maven翻译成中文是"专家.内行".M ...

  9. es6 依赖循环_探索 JavaScript 中的依赖管理及循环依赖

    我们通常会把项目中使用的第三方依赖写在 package.json 文件里,然后使用 npm .cnpm 或者 yarn 这些流行的依赖管理工具来帮我们管理这些依赖.但是它们是如何管理这些依赖的.它们之 ...

最新文章

  1. c语言错误的等式,C语言学习中几个常见典型错误分析.docx
  2. C++找到一个大于或等于n且为2的幂的数字p的算法实现(附完整源码)
  3. Python调用ansible API系列(一)获取资产信息
  4. linux多选项菜单脚本,linux shell 编写菜单脚本事例
  5. 腾讯优图、AI Lab招聘计算机视觉算法工程师
  6. python与数学关系大吗_通过一个简单的数学游戏,清晰了解各大编程语言之间的一些区别...
  7. 深度|数据库产品如何选型?掌握这一招就够了
  8. 升级AndrOid4.3,谷歌发布Android 4.3系统 今日开始升级
  9. 使用ExtJs实现文件下载
  10. 整数划分之四 【区间dp】讲解于思考方法
  11. 模块二 会务现场服务策划方案 案例1样本
  12. 使用晨曦记账本记账,将账目明细导出excel表格上
  13. 华为折叠手机是鸿蒙系统吗,华为发布新一代折叠屏手机 将首批升级鸿蒙系统...
  14. 计算机表格斜杠怎么打,【2人回答】Excel表格中如何输入斜杠?-3D溜溜网
  15. 菩萨蛮 生如夏花(赵敏)
  16. LaTeX中实心圆点列表的一点经验
  17. pid倒立摆matlab,基于MATLAB的直线一级倒立摆的PID控制研究
  18. Linux基础命令实例
  19. 安全牛:安全与业务不存在平衡 证明价值是关键
  20. 使用Markdown语法介绍markdown

热门文章

  1. linux下quota实现用户的硬盘配额
  2. vue降低cli版本错误 ERROR: ~/.vuerc may be outdated. Please delete it and re-run vue-cli in manual mode
  3. 在WINCC中使用自定义的动画效果控件ocx
  4. 无法完成请求,因为某种原因阻止文本引擎进行初始化
  5. C# excel文件导入导出
  6. Word怎么批量更改字体颜色?
  7. 提交MapReduce任务出错:unknown queue: default
  8. 微信小程序复杂条件判断按钮显示隐藏
  9. 外服玩WOW,必备英语词汇
  10. Python 获取二维数组的某一列