主项目Hazelcast版本与通用库不一致,为何采用Spring Boot父POM版本?
问题原因与解决方案
这是因为Spring Boot父POM的**依赖管理(Dependency Management)**特性在起作用,它会统一管控项目中依赖的版本,优先级比你在通用库中直接声明的依赖版本更高,具体原因和解决办法如下:
为什么版本会被替换?
- Spring Boot的父POM(
spring-boot-starter-parent)中包含了一个dependencyManagement区块,里面预定义了大量常用第三方依赖的默认版本(包括Hazelcast)。当你的主项目继承这个父POM时,Maven会优先使用这里定义的版本,忽略子依赖(比如你的something-common)中声明的版本。 - 你的通用库本身没有继承Spring Boot父POM,所以它自己执行
mvn dependency:tree时会显示你声明的3.9版本;但当它被主项目依赖时,主项目的依赖管理规则会生效,把Hazelcast版本替换成父POM中定义的3.7.8。
如何验证?
你可以打开主项目依赖的Spring Boot父POM文件,找到dependencyManagement部分,肯定能看到类似这样的配置:
<dependency> <groupId>com.hazelcast</groupId> <artifactId>hazelcast</artifactId> <version>3.7.8</version> </dependency> <dependency> <groupId>com.hazelcast</groupId> <artifactId>hazelcast-client</artifactId> <version>3.7.8</version> </dependency>
解决办法
根据你的需求,有两种常见处理方式:
1. 让主项目使用通用库的3.9版本
在主项目的pom.xml中,添加dependencyManagement区块,显式声明Hazelcast的3.9版本,覆盖Spring Boot父POM的默认配置:
<dependencyManagement> <dependencies> <dependency> <groupId>com.hazelcast</groupId> <artifactId>hazelcast</artifactId> <version>3.9</version> </dependency> <dependency> <groupId>com.hazelcast</groupId> <artifactId>hazelcast-client</artifactId> <version>3.9</version> </dependency> </dependencies> </dependencyManagement>
2. 让通用库遵循Spring Boot的版本管控
如果希望通用库和主项目的依赖版本保持一致,可以让通用库导入Spring Boot的依赖管理(不需要继承完整的starter-parent),这样通用库会自动使用Spring Boot定义的版本:
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>你的Spring Boot版本号</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
内容的提问来源于stack exchange,提问作者hudi
相关产品推荐
相关产品推荐

