Maven dependencyManagement中的依赖版本会覆盖传递依赖版本
最近在项目中使用Maven遇到一个问题,明明传递依赖进来的是最新版本,但引用的还是旧版本。原来在parent pom
中的dependencyManagement
里指定了一个低版本的依赖,然后传递依赖的包版本就是低版本了。
在Maven官方文档中Introduction to the Dependency Mechanism有一段话:
Dependency management - this allows project authors to
directly specify the versions of artifacts to be used
when they are encountered in transitive dependencies orin dependencies where no version has been specified.
大概意思是:
pom文件中没有指定版本的依赖或是传递的依赖,如果在dependencyManagement中有指定此依赖版本,那就使用dependencyManagement中定义的版本号。
来一个例子看一下:
假设我pom中的依赖长这样:
<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>5.0.1.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.0.1.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>5.0.1.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>5.0.1.RELEASE</version></dependency></dependencies>
通过mvn dependency:tree
看一下依赖树,传递依赖的包版本都是正确的:
现在在parent中的dependencyManagement加入:
<dependencyManagement><dependencies><dependency><!-- Import dependency management from Spring Boot --><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>1.5.13.RELEASE</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>
再来看一下依赖树:
parent的dependencyManagement中spring boot 依赖的spring版本是4.3.17.RELEASE
,将5.0.1.RELEASE
的传递依赖进来的spring版本都指定成了4.3.17.RELEASE
。
包依赖版本不一致,在运行项目时就会有问题了,由此 dependencyManagement 是一个控制依赖包版本的利器,但也会带来一些问题,在排查jar包冲突的时候尤其要注意。
还有一个要注意的是在parent里定义的依赖scope会影响到传递进来的依赖:
<dependencyManagement><dependencies><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency></dependencies>
</dependencyManagement>
继承这个parent的pom里直接依赖或传递依赖servlet-api
,scope将是provided,然后你用 jetty 作为一个嵌入式容器启动的时候,会报找不到 servlet-api类的异常。provided 的语义是保证项目正常编译,但在运行项目main方法或打包成一个jar包时不会包含这个依赖。
如何解决
如果传递依赖的版本被 parent 中的 dependencyManagement 版本给覆盖了,那就直接在项目的最上层模块中把这个依赖引进来并指定版本。比如下面这个Spring Boot项目:
直接在红框里的 pom 文件引入对应的传递依赖,这个模块是 Spring Boot 运行 main 方法的模块,maven 在打包的时候,这个模块里直接引入的依赖优先级都是最高的,其它项目也类似。
参考Maven 父pom中dependencyManagement版本优先级高于传递依赖版本
maven的传递依赖与scope关系
Maven dependencyManagement中的依赖版本会覆盖传递依赖版本相关推荐
- Maven 父pom中dependencyManagement版本优先级高于传递依赖版本
当使用了传递依赖,也就是使用了没有显示声明的依赖时,如果继承的<dependencyManagement/>中声明了使用的传递依赖的版本,那么最终使用的依赖是<dependencyM ...
- 数据库三大范式详解,部分依赖、完全依赖、传递依赖
数据库三大范式详解以及部分.完全.传递依赖 一.第一范式 二.第二范式 三.第三范式 四.部分依赖.完全依赖.传递依赖 完结撒花 一.第一范式 数据库每一列都是不可分的基本数据项(原子数据项) 就比如 ...
- 数据库的部分依赖,完全依赖,传递依赖以及三种范式总结
关系数据库理论也称为关系的规范化理论,是数据库的理论基础,同时也是数据库设计的有力工具. 规范化,数据依赖的公理系统和模式的分解是本科阶段要了解的内容,而后两者在研究生学习阶段需要加深巩固,所以对这几 ...
- 数据库传递依赖,什么叫做传递依赖?
数据库传递依赖 不存在传递依赖是数据库第三范式的规定,本人将传递依赖总结为以下内容,请仔细阅读并思考其中的道理. "一个实体对应多个属性和一定的联系,不能将多个实体和多个实体的属性放入一个表 ...
- java 依赖算法_java – Maven 2 – 从传递依赖版本定义依赖版本
我会用我的实际情况来解释这个问题. 我使用logback 1.0.1进行日志记录,它包含SLF4J 1.6.4作为依赖项.我还将SLF4J API桥用于遗留日志API(java.util.loggin ...
- 智能一代云平台(三十六):项目中如何做到避免传递依赖
[前言] 现在Maven项目风靡全球,不可否认的是Maven在解决项目依赖关系十分的给力:不过传递依赖也会有很多坑:接下来给大家分享一下我们项目中是如何解决传递依赖. [传递依赖中哪些事儿] ...
- 在Maven项目中使用tk-mybatis(不结合SpringBoot)
什么是tk-mybatis 通用 Mapper4(tk-mybatis) 是一个可以实现任意 MyBatis 通用方法的框架,项目提供了常规的增删改查操作以及Example 相关的单表操作.通用 Ma ...
- 【转】Maven实战(七)---传递依赖
原博文出自于:http://blog.csdn.net/liutengteng130/article/details/47000069 感谢! 假设A-->C B-->A ...
- java 依赖倒置_JAVA设计模式之依赖倒转原则
3.1 依赖倒置原则的定义 依赖倒置原则(Dependence Inversion Principle,简称DIP)这个名字看着有点别扭,"依赖"还"倒置",这 ...
最新文章
- Android 基于 Speex 的高度封装语音库,0 耦合,没三方jar包
- 所谓 jQuery 插件,怎样开发一个 jQuery 插件
- RequireJS进阶(一) 转
- LVS(13)——DR模型准备工作及ip地址冲突问题
- PHP中的逆波兰式应用
- android studio抛出,Android Studio中新的项目不能运行,抛出错误(Android Studio new pr
- python设计模式22-模板模式
- 如何实现自动化前端开发?
- 【翻译】Sencha Touch 2入门:创建一个实用的天气应用程序之一
- Aqua data studio 19 汉化方法
- selenium: 登录QQ空间并破解滑块验证
- 百度地图开放平台web api 获取上海市所有小区信息
- 微信公众号和mysql连接_微信公众号连接数据库如何实现?
- 同盾科技声纹识别建模大赛
- 【第六篇】Qt学习与使用---在qt中打印PDF文件(不是生成PDF)
- R语言用WinBUGS 软件对学术能力测验(SAT)建立分层模型
- Hash Verification哈希值校验工具
- Java数据结构-认识链表
- 7款神仙级非常漂亮的 Linux 操作系统UI,你都用过吗
- 用原版XP SP3集成最新补丁制作ISO镜像的方法
热门文章
- python升级或降级pip版本以及镜像源的设置
- 带你快速玩转canvas(8)非常用API的说明集
- ruoyi是怎么点击菜单跳转页面的_手把手教你设置公众号菜单栏
- 笔记本待机长时间不操作自动关机如何解决?
- android屏蔽系统按键精灵,安卓按键精灵的,关闭app程序问题!
- List 转 Array数组
- 原生js写的左侧飞入拼图特效,你是喜欢美女单飞还是双飞?程序员就是可以为所欲为!
- com.typesafe.config.ConfigException$BugOrBroken: com.typesafe.config.impl.SerializedConfigValue shou
- 人工智能医疗革命已经开始,但患者会接受 Dr. AI 吗?
- git push origin master时出错无法上传及github学习使用时遇到的其他一些问题错误