背景
- 最近在梳理项目的第三方依赖
- 准备清理相关无用依赖,减少依赖jar的数量与大小
- 此时,同事反馈了一个问题,说在某项目上发现Rocketmq依赖存在多个版本冲突
- 然后开始确认并调查原因
排查过程
- 第一步,当然先看下idea里面的依赖情况
- 果不其然,确实发现明显存在两套rocketmq配套版本
- 然后去查maven 的 pom文件,全局查找rocketmq关键字
- 仅在一个全局的common模块中发现一个rocketmq-spring-boot-starter依赖
- 这里明显可以看到,rocket的版本确实是2.1.1,但为什么到最后打fatjar时打进去的就是2.0.2配套呢?
- 该死的问题,一下让我陷入了沉思,觉得很不可思议,我都在公共模块中显示指定了版本,怎么还是一个未显示的2.0.2?
- 然后连蒙带猜的排查排查,查spring-boot-parent、cloud-parent、以及他们的dependency模块,无果
- 我创建一个当独的,干净的模块,依赖这个common模块
- 结果打出来的jar里面还是2.0.2,绝望了感觉,不科学
- 来回折腾,大概查了有3个小时,终于来了灵感
- 想起了,rocketmq 是谁的?不是阿里开源的?既然不是spring原生家族里的,那应该看看spring cloud alibaba不是吗?
- 于是打开父工程里的依赖管理,找到spring-cloud-alibaba-dependencies
解决方案
- 问题总算定位到了,就好解决了
- 这里试了下几个方案,在父工程中,直接覆盖版本变量,也就是加下面这个内容到
properties
<rocketmq.starter.version>2.1.1</rocketmq.starter.version>
- 不行,不能干预原本依赖的版本,于是再直接在父工程的依赖管理中添加
<!-- mq rocketmq ,此处覆盖 alibaba-dependencies 默认版本 -->
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
<version>${rocketmq.starter.version}</version>
</dependency>
- 重新clean package,OK,完美解决,最后可以把common模块里的版本定义也可以去掉了