如何不修改Spring Boot父版本覆盖Elasticsearch依赖版本?
问题原因
Spring Boot父项目(如2.7.5)通过dependencyManagement统一管控所有依赖的版本,包括Elasticsearch与Spring Data Elasticsearch的绑定版本。直接修改spring-data-elasticsearch的依赖版本无法生效,是因为父项目的版本管控优先级更高;单独使用exclude标签无效,则是因为Elasticsearch相关依赖属于Spring Data Elasticsearch的传递依赖,父项目仍会通过dependencyManagement注入指定版本。
解决方案
方法1:通过Spring Boot内置属性覆盖版本
Spring Boot提供了专门的属性来指定Elasticsearch版本,直接在pom.xml的<properties>节点中添加配置即可覆盖父项目的设置:
<properties> <!-- 覆盖Elasticsearch版本为7.12.1 --> <elasticsearch.version>7.12.1</elasticsearch.version> </properties>
该属性会被父项目的dependencyManagement引用,直接替换所有Elasticsearch相关依赖的版本,同时Spring Data Elasticsearch会自动适配对应版本(Spring Data Elasticsearch 4.1.x与Elasticsearch 7.12.x为兼容匹配版本,符合需求)。
方法2:在dependencyManagement中显式声明版本
如果属性覆盖不生效,可以在pom.xml中添加dependencyManagement节点,显式声明Elasticsearch核心及客户端依赖的版本,优先级高于父项目的管控:
<dependencyManagement> <dependencies> <!-- 声明Elasticsearch核心版本 --> <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>7.12.1</version> </dependency> <!-- 声明Elasticsearch高级客户端版本 --> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>7.12.1</version> </dependency> <!-- 若有其他Elasticsearch相关依赖,可在此统一声明版本 --> </dependencies> </dependencyManagement>
添加后,所有相关依赖会使用这里指定的版本,不受父项目版本管控影响。
注意事项
无需修改spring-data-elasticsearch的版本,Spring Data Elasticsearch 4.1.x与Elasticsearch 7.12.1完全兼容,强制修改反而可能引发兼容性问题。
内容的提问来源于stack exchange,提问作者user3115

