Maven版本依赖问题

原因

今天在适配Milvus数据源的时候,代码出问题了,问题是

Milvus中的一个依赖包中包含protobuf这个包,这个包的版本是3.24.0。

同时还有一个依赖forest-spring-boot-starter也包含protobuf这个包,版本是3.14.0,

但是milvus中使用MilvusClient在创建client连接的时候会需要protobuf3.24.0中的GeneratedMessageV3的isStringEmpty这个方法

image-20250304213634242

但是protobuf 3.14.0中的GeneratedMessageV3没有isStringEmpty方法

image-20250304213816056

由于Milvus是外部包引入的,所以会导致冲突将3.24.0转换成3.14.0

配置文件如下,这是工程A引入的依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<dependencies>
<!-- 依赖于nuyoah-framework模块 -->
<dependency>
<groupId>org.example</groupId>
<artifactId>nuyoah-framework</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.dtflys.forest</groupId>
<artifactId>forest-spring-boot-starter</artifactId>
<version>1.5.19</version>
</dependency>
<dependency>
<groupId>org.example</groupId>
<artifactId>nuyoah-blog</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>

这是工程nuyoah-blog引入的依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<dependencies>
<!-- 依赖于nuyoah-framework模块 -->
<dependency>
<groupId>org.example</groupId>
<artifactId>nuyoah-framework</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
<dependency>
<groupId>io.milvus</groupId>
<artifactId>milvus-sdk-java</artifactId>
<version>2.5.3</version>
</dependency>
</dependencies>

由上面依赖发现,nuyoah-blog引入了milvus,而工程A引入了nuyoah-blog,从而工程A中也有milvus依赖,但是工程A在使用nuyoah-blog中调用milvus的操作的时候出现了问题

nuyoah中milvus想要调用protobuf3.24.0中的一些方法,但是工程A中只有protobuf3.14.0,所以有些方法没有

image-20250304214614143

由图中可以看出,3.24.0被3.14.0覆盖了

总结

终其原因:项目A引入了依赖1,依赖1中包含依赖2,项目B引入了依赖3,依赖3也包含了依赖2,并且这两个依赖2版本不同,这时候项目A引入了项目B,导致依赖1中的依赖2,覆盖掉了依赖3中的依赖2,最后出现一些奇奇怪怪的问题

解决方法

排除A

将A中依赖1中的依赖2版本排除掉,引入依赖3中的依赖2的版本,这样项目A和项目B中的依赖2都是走项目A中的依赖版本信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<dependencies>
<!-- 依赖于nuyoah-framework模块 -->
<dependency>
<groupId>org.example</groupId>
<artifactId>nuyoah-framework</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.dtflys.forest</groupId>
<artifactId>forest-spring-boot-starter</artifactId>
<version>1.5.19</version>
<exclusions>
<!-- 排除低版本中的依赖信息 -->
<exclusion>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 引入通用版本的依赖信息 -->
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.24.0</version>
</dependency>
<dependency>
<groupId>org.example</groupId>
<artifactId>nuyoah-blog</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>

image-20250304215321398

使用dependencyManagement

使用dependencyManagement版本管理工具,将为指定的版本依赖指向管理工具中的依赖项

1
2
3
4
5
6
7
8
9
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.24.0</version>
</dependency>
</dependencies>
</dependencyManagement>

image-20250304215655674