当使用了传递依赖,也就是使用了没有显示声明的依赖时,如果继承的<dependencyManagement/>中声明了使用的传递依赖的版本,那么最终使用的依赖是<dependencyManagement/>中声明的版本。

Spring举一个栗子:

1.mvn dependency:tree

先看下项目依赖的基础组件使用的Spring版本。

可以看到基础组件使用的Spring版本为3.1.3,不能lambda表达式(被坑过)。

2.mvn dependency:analyze

接下来分析下依赖,关注Spring的相关依赖。

可以看到Spring作为传递依赖使用,版本是基础组件使用的版本3.1.3

3.parent module

然后在项目的parent module<dependencyManagement/>加入一个spring-framework-bom来管理Spring的版本。

${springframework.version}5.0.4.RELEASE

4.重新执行mvn dependency:tree

可以看到Spring的版本变为了5.0.4.RELEASE

在执行mvn dependency:analyze后看到使用的Spring版本也变成了5.0.4.RELEASE

5.文档

  • Dependency management - this allows project authors to directly specify the versions of artifacts to be used when they are encountered in transitive dependencies or in dependencies where no version has been specified. In the example in the preceding section a dependency was directly added to A even though it is not directly used by A. Instead, A can include D as a dependency in its dependencyManagement section and directly control which version of D is used when, or if, it is ever referenced.

文档连接:maven.apache.org/guides/intr…
作者:虎纹咸鱼
链接:https://juejin.im/post/5d6655e6e51d4561f777e1ef
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Maven 父pom中dependencyManagement版本优先级高于传递依赖版本
直接上例子:

父pom

<dependencyManagement><dependencies><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.2</version></dependency>
</dependencyManagement>

该工程beanutils将会传递依赖logging 1.1.1

<dependency><groupId>commons-beanutils</groupId><artifactId>commons-beanutils</artifactId><version>1.9.2</version>
</dependency>

此时该工程中logging的版本将是1.2,即父pom dependencyManagement中的版本

----------------------------------------------------------------------------------------------------------------------------------------------------------------------

dependencies
一般我们在 Maven 管理的项目中会看到 dependencies 的使用,通过这个标签,来管理依赖。

<dependencies><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.17</version></dependency>
</dependencies>

但是会出现一些弊端:

1.在多模块的项目中,如果父 pom 中引入依赖,则子模块会全盘接受父 pom 中引入的依赖,即使它本身不需要这个依赖。如果子模块单独启动或打包的话,速度变慢、打的jar臃肿。

2.为了避免第一个问题,则在子模块中进行所需依赖。但是如果,其他子模块也需要这个依赖时,不注意就容易造成版本冲突。

因此才有了 dependencyManagement。

dependencyManagement
这个标签在多模块的项目尤其好用。

使用位置
一般是用在父 pom 中的。使用示例
父模块 pom

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><version>2.1.9.RELEASE</version><scope>test</scope><exclusions><exclusion><groupId>com.vaadin.external.google</groupId><artifactId>android-json</artifactId></exclusion></exclusions></dependency>
</dependencies><dependencyManagement><dependencies><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.17</version></dependency></dependencies>
</dependencyManagement>

在父 pom 中声明了上述的依赖,实际不会直接真实导入依赖。而只是一个声明的作用。

使用 Maven Helper 查看一下父级 pom。

可以看到,只有通过 dependencies 引入的依赖。

子模块 pom
子模块 pom 可以根据需要,只声明对应的 groupId 和 artifactId 来引入依赖。而省略的 version 和 scope,会沿着树向上层 pom 查找最近的 dependencyManagement 声明的 groupId 和 artifactId,并使用其声明的 version 和 scope。

<dependencies><!-- external --><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId></dependency>
</dependencies>

子模块覆盖
允许子模块声明 version 和 scope, 来覆盖父级继承的配置。

<dependencies><!-- external --><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.18</version></dependency>
</dependencies>

明确传递依赖版本
使用 dependencyManagement 时,如果项目中出现了多个传递依赖的版本,会被 dependencyManagement 声明的版本覆盖。有好处也有坏处。

如果版本兼容的话,就剩了我们去排除版本的麻烦。

缺点是,出现版本冲突的时候,不是很容易被注意到。

依赖优先级
父 pom 中的 dependencyManagement 是允许被子模块的 dependencyManagement 覆盖的。

沿着树向上层 pom 查找最近的 dependencyManagement 声明的 groupId 和 artifactId。这也就说明了如果子类 dependencyManagement 声明了与父 dependencyManagement 相同的 groupId 和 artifactId,则以最近的为准。如果层次相同,则先声明的优先级更高。

因此,结合 dependencies 来看:

1.dependencies 优先级高于 dependencyManagement。

2.在依赖树上,离引入位置越近的层次,则优先级越高。

3.层次相同,则先声明的优先级更高。

Maven 父pom中dependencyManagement版本优先级高于传递依赖版本相关推荐

  1. Maven dependencyManagement中的依赖版本会覆盖传递依赖版本

    最近在项目中使用Maven遇到一个问题,明明传递依赖进来的是最新版本,但引用的还是旧版本.原来在parent pom中的dependencyManagement里指定了一个低版本的依赖,然后传递依赖的 ...

  2. java 依赖算法_java – Maven 2 – 从传递依赖版本定义依赖版本

    我会用我的实际情况来解释这个问题. 我使用logback 1.0.1进行日志记录,它包含SLF4J 1.6.4作为依赖项.我还将SLF4J API桥用于遗留日志API(java.util.loggin ...

  3. Maven在POM中使用profile方便的切换war和jar的制作

    1 问题描述 由于在工作中,经常需要把项目制作成war包,然后部署到容器中,而在IDEA中可以很方便的直接调试,便有了如下的两种情形 在开发过程中,不需要频繁的部署到远程容器中,而需要不断的通过Deb ...

  4. maven项目pom中scope类型

    1.compile:默认值 他表示被依赖项目需要参与当前项目的编译,还有后续的测试,运行周期也参与其中,是一个比较强的依赖.打包的时候通常需要包含进去2.test:依赖项目仅仅参与测试相关的工作,包括 ...

  5. maven父pom和子pom的版本号一并批量修改

    1 设置新的版本号 mvn versions:set -DnewVersion=1.7-SNAPSHOT 2 撤销设置 mvn versions:revert 3 提交设置 mvn versions: ...

  6. maven pom java版本_Maven更新POM中的JDK版本(比如更新为JDK1.8)

    默认POM如果不指定JDK版本为1.5,而有些项目需要使用泛型这些,就必须使用1.8版本的JDK,所以需要手动修改POM. 打开pom.xml文件修改,增加如下配置节点: [...] [...] or ...

  7. java ee maven_针对新手的Java EE7和Maven项目–第1部分–简单的Maven项目结构–父pom...

    java ee maven 为什么呢 很多时候,我在日常工作中试图解决一些基本或复杂的Maven / Java EE项目结构问题. 为了提供解决方案,我经常最终会尝试项目结构,测试我在不同应用程序服务 ...

  8. 针对新手的Java EE7和Maven项目–第1部分–简单的Maven项目结构–父pom

    为什么呢 很多时候,我在日常工作中试图解决一些基本或复杂的Maven / Java EE项目结构问题. 为了提供解决方案,我经常最终会尝试项目结构,测试我在不同应用程序服务器上的部署并细化我的配置. ...

  9. Maven中dependencyManagement标签和dependencies的区别

    今天在maven的pom文件中看到了dependencyManagement标签,用法如下: <dependencyManagement><dependencies><d ...

最新文章

  1. Java连接HBASE数据库,创建一个表,删除一张表,修改表,输出插入,修改,数据删除,数据获取,显示表信息,过滤查询,分页查询,地理hash
  2. 关于onclick点击无效问题
  3. abrels.inc.php_fckk.php
  4. Django访问java建立的数据库
  5. python读取多个txt文件数据恢复_带有Pandas的Python 2.7:如何恢复两个数据帧...
  6. MyBatis 实现关联表查询
  7. HDU1570 A C【水题】
  8. 初识Memcache之安装与测试
  9. python运维书籍推荐_python运维书籍
  10. python程序员专用壁纸_Python程序员必用的电脑桌面
  11. EtherCAT xml 解析(不定时更新)
  12. 电脑声音图标显示正常却没有声音,扬声器显示未插入
  13. linux基础教程之部署Go语言程序到Linux服务器
  14. 那个男人他不装了,他必须硬卷!
  15. PBOC规范研究之十 ---标准动态数据认证(转)
  16. Java SE 第三讲(原生数据类型使用陷阱 Pitfall of Primitive Data Type)
  17. 【历史上的今天】12 月 25 日:第一个网络服务器诞生;黑客社区的创始人出生;牛顿诞生
  18. mysql一对多如何设计_数据库在一对一、一对多、多对多怎么设计表关系
  19. 易语言模拟器中控源码 全新手游模拟器通用中控源码, 适用于各种游戏, 源码现成的只需要更换游戏就可以用哦
  20. 吉大19年9月计算机应用,吉大19年9月《计算机应用基础》作业考核试题(100分)

热门文章

  1. aspen模拟蒸发器_用aspen计算多效蒸发器:高浓盐废水处理蒸发工艺简介
  2. Pandas DataFrame入门教程(图解版)
  3. 常用的一些子域名,旁站查询
  4. 有关Access的压缩和修复数据库功能
  5. 中小微企业的信贷决策
  6. 翻译:Swarm intelligence群体智慧
  7. 【数据库】谈谈分库分表吧?
  8. 2018-01-05 通用型的中文编程语言探讨之一: 高考 1
  9. 考研后悔排行榜大盘点!这些雷要尽早避开!
  10. redis统计用户日活量_玩转Redis-HyperLogLog统计微博日活月活