最近在项目中使用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中的依赖长这样:
通过mvn :tree 看一下依赖树,传递依赖的包版本都是正确的:
文章插图
现在在中的加入:
org.springframework.boot spring-boot-dependencies1.5.13.RELEASE pomimport
再来看一下依赖树:
文章插图
的中 boot 依赖的版本是4.3.17.,将5.0.1.的传递依赖进来的版本都指定成了4.3.17. 。
包依赖版本不一致,在运行项目时就会有问题了,由此是一个控制依赖包版本的利器,但也会带来一些问题,在排查jar包冲突的时候尤其要注意 。
还有一个要注意的是在里定义的依赖scope会影响到传递进来的依赖:
javax.servlet javax.servlet-api3.1.0 provided
【Maven dependencyManagement中的依赖版本会覆盖传递依赖版】继承这个的pom里直接依赖或传递依赖-api,scope将是,然后你用 jetty 作为一个嵌入式容器启动的时候,会报找不到 -api类的异常 。的语义是保证项目正常编译,但在运行项目main方法或打包成一个jar包时不会包含这个依赖 。
如何解决
如果传递依赖的版本被中的版本给覆盖了,那就直接在项目的最上层模块中把这个依赖引进来并指定版本 。比如下面这个 Boot项目:
直接在红框里的 pom 文件引入对应的传递依赖,这个模块是Boot 运行 main 方法的模块,maven 在打包的时候,这个模块里直接引入的依赖优先级都是最高的,其它项目也类似 。
参考Maven 父pom中版本优先级高于传递依赖版本
maven的传递依赖与scope关系
- 海贼王中的7位大胃王,最能吃的不是路飞,而是她和大妈 路飞世界之最
- 淹没在迷雾中的真相:究竟是谁制造了梃击案
- 盆景中的贵族:这四种盆景被称为盆景中的艺术品,你养过吗 全世界十大盆景
- 央视春晚,我眼中的三宗“最” 中国之最节目串词
- 除了个大之外,他们还有啥秘密?泰坦金刚——变形金刚中的巨无霸 玩具世界之最
- 我国最大的湖泊——青海湖,湖中的鱼却又少又小,这是为何? 中国之最小的湖
- 被断绝的通天神树,山海经五大惊奇之四 山海经中的四个世界之最
- 黄巾起义中的张角真能撒豆成兵
- maven连同所有依赖包一起打包成jar包
- 冷冻之中的明尼苏达州雪人为大脚野人尸体