最近在项目中使用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中的依赖版本会覆盖传递依赖版本相关推荐

  1. Maven 父pom中dependencyManagement版本优先级高于传递依赖版本

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

  2. 数据库三大范式详解,部分依赖、完全依赖、传递依赖

    数据库三大范式详解以及部分.完全.传递依赖 一.第一范式 二.第二范式 三.第三范式 四.部分依赖.完全依赖.传递依赖 完结撒花 一.第一范式 数据库每一列都是不可分的基本数据项(原子数据项) 就比如 ...

  3. 数据库的部分依赖,完全依赖,传递依赖以及三种范式总结

    关系数据库理论也称为关系的规范化理论,是数据库的理论基础,同时也是数据库设计的有力工具. 规范化,数据依赖的公理系统和模式的分解是本科阶段要了解的内容,而后两者在研究生学习阶段需要加深巩固,所以对这几 ...

  4. 数据库传递依赖,什么叫做传递依赖?

    数据库传递依赖 不存在传递依赖是数据库第三范式的规定,本人将传递依赖总结为以下内容,请仔细阅读并思考其中的道理. "一个实体对应多个属性和一定的联系,不能将多个实体和多个实体的属性放入一个表 ...

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

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

  6. 智能一代云平台(三十六):项目中如何做到避免传递依赖

    [前言] 现在Maven项目风靡全球,不可否认的是Maven在解决项目依赖关系十分的给力:不过传递依赖也会有很多坑:接下来给大家分享一下我们项目中是如何解决传递依赖. [传递依赖中哪些事儿]     ...

  7. 在Maven项目中使用tk-mybatis(不结合SpringBoot)

    什么是tk-mybatis 通用 Mapper4(tk-mybatis) 是一个可以实现任意 MyBatis 通用方法的框架,项目提供了常规的增删改查操作以及Example 相关的单表操作.通用 Ma ...

  8. 【转】Maven实战(七)---传递依赖

    原博文出自于:http://blog.csdn.net/liutengteng130/article/details/47000069   感谢! 假设A-->C  B-->A      ...

  9. java 依赖倒置_JAVA设计模式之依赖倒转原则

    3.1 依赖倒置原则的定义 依赖倒置原则(Dependence Inversion Principle,简称DIP)这个名字看着有点别扭,"依赖"还"倒置",这 ...

最新文章

  1. Android 基于 Speex 的高度封装语音库,0 耦合,没三方jar包
  2. 所谓 jQuery 插件,怎样开发一个 jQuery 插件
  3. RequireJS进阶(一) 转
  4. LVS(13)——DR模型准备工作及ip地址冲突问题
  5. PHP中的逆波兰式应用
  6. android studio抛出,Android Studio中新的项目不能运行,抛出错误(Android Studio new pr
  7. python设计模式22-模板模式
  8. 如何实现自动化前端开发?
  9. 【翻译】Sencha Touch 2入门:创建一个实用的天气应用程序之一
  10. Aqua data studio 19 汉化方法
  11. selenium: 登录QQ空间并破解滑块验证
  12. 百度地图开放平台web api 获取上海市所有小区信息
  13. 微信公众号和mysql连接_微信公众号连接数据库如何实现?
  14. 同盾科技声纹识别建模大赛
  15. 【第六篇】Qt学习与使用---在qt中打印PDF文件(不是生成PDF)
  16. R语言用WinBUGS 软件对学术能力测验(SAT)建立分层模型
  17. Hash Verification哈希值校验工具
  18. Java数据结构-认识链表
  19. 7款神仙级非常漂亮的 Linux 操作系统UI,你都用过吗
  20. 用原版XP SP3集成最新补丁制作ISO镜像的方法

热门文章

  1. python升级或降级pip版本以及镜像源的设置
  2. 带你快速玩转canvas(8)非常用API的说明集
  3. ruoyi是怎么点击菜单跳转页面的_手把手教你设置公众号菜单栏
  4. 笔记本待机长时间不操作自动关机如何解决?
  5. android屏蔽系统按键精灵,安卓按键精灵的,关闭app程序问题!
  6. List 转 Array数组
  7. 原生js写的左侧飞入拼图特效,你是喜欢美女单飞还是双飞?程序员就是可以为所欲为!
  8. com.typesafe.config.ConfigException$BugOrBroken: com.typesafe.config.impl.SerializedConfigValue shou
  9. 人工智能医疗革命已经开始,但患者会接受 Dr. AI 吗?
  10. git push origin master时出错无法上传及github学习使用时遇到的其他一些问题错误