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

最近在项目中使用Maven遇到一个问题,明明传递依赖进来的是最新版本,但引用的还是旧版本 。原来在 pom中的里指定了一个低版本的依赖,然后传递依赖的包版本就是低版本了 。
在Maven官方文档中 to the有一段话:
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文件中没有指定版本的依赖或是传递的依赖,如果在中有指定此依赖版本,那就使用中定义的版本号 。
来一个例子看一下:
假设我pom中的依赖长这样:
org.springframeworkspring-beans5.0.1.RELEASEorg.springframeworkspring-context5.0.1.RELEASEorg.springframeworkspring-test5.0.1.RELEASEorg.springframeworkspring-core5.0.1.RELEASE
通过mvn :tree 看一下依赖树,传递依赖的包版本都是正确的:

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

文章插图
现在在中的加入:
org.springframework.bootspring-boot-dependencies1.5.13.RELEASEpomimport
再来看一下依赖树:
Maven dependencyManagement中的依赖版本会覆盖传递依赖版

文章插图
的中 boot 依赖的版本是4.3.17.,将5.0.1.的传递依赖进来的版本都指定成了4.3.17. 。
包依赖版本不一致,在运行项目时就会有问题了,由此是一个控制依赖包版本的利器,但也会带来一些问题,在排查jar包冲突的时候尤其要注意 。
还有一个要注意的是在里定义的依赖scope会影响到传递进来的依赖:
javax.servletjavax.servlet-api3.1.0provided
【Maven dependencyManagement中的依赖版本会覆盖传递依赖版】继承这个的pom里直接依赖或传递依赖-api,scope将是,然后你用 jetty 作为一个嵌入式容器启动的时候,会报找不到 -api类的异常 。的语义是保证项目正常编译,但在运行项目main方法或打包成一个jar包时不会包含这个依赖 。
如何解决
如果传递依赖的版本被中的版本给覆盖了,那就直接在项目的最上层模块中把这个依赖引进来并指定版本 。比如下面这个 Boot项目:
直接在红框里的 pom 文件引入对应的传递依赖,这个模块是Boot 运行 main 方法的模块,maven 在打包的时候,这个模块里直接引入的依赖优先级都是最高的,其它项目也类似 。
参考Maven 父pom中版本优先级高于传递依赖版本
maven的传递依赖与scope关系