Spring Boot 1.5.7集成Elasticsearch 5.6.3依赖冲突及异常求助
我之前也踩过Spring Boot和Elasticsearch版本兼容的坑,你的问题核心在于Spring Boot的依赖管理机制会强制统一子依赖版本,再加上spring-data-elasticsearch和Elasticsearch本身有严格的版本对应关系,直接改版本很容易出问题。下面给你一步步拆解解决:
问题根源
- Spring Boot 1.5.x的默认依赖管理(
spring-boot-dependencies)中,绑定的spring-data-elasticsearch是2.x版本,对应Elasticsearch 2.4.6,所以即使你手动指定spring-data-elasticsearch为3.0.2,Maven还是会自动下载2.4.6的Elasticsearch包。 - 当你强制把Elasticsearch改成5.6.3时,spring-data-elasticsearch 3.0.2需要的Elasticsearch客户端依赖(比如
transport、rest-client等)和Spring Boot默认引入的版本不匹配,导致运行时缺少类或方法。
具体解决步骤
1. 确认版本对应关系
先明确:spring-data-elasticsearch 3.0.x(属于Spring Data Kay版本)是兼容Spring Boot 1.5.x的,且对应Elasticsearch 5.5.x-5.6.x,所以你的版本组合是可行的,只是需要正确配置依赖。
2. 在pom.xml中统一管理Elasticsearch相关版本
通过dependencyManagement节点覆盖Spring Boot默认的Elasticsearch版本,确保所有ES相关依赖都使用5.6.3:
<dependencyManagement> <dependencies> <!-- 覆盖Elasticsearch核心包版本 --> <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>5.6.3</version> </dependency> <!-- 覆盖Transport客户端版本 --> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>transport</artifactId> <version>5.6.3</version> </dependency> <!-- 如果使用Rest客户端,也需要覆盖版本 --> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-client</artifactId> <version>5.6.3</version> </dependency> <!-- 覆盖spring-data-elasticsearch版本 --> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-elasticsearch</artifactId> <version>3.0.2.RELEASE</version> </dependency> </dependencies> </dependencyManagement>
3. 排除Spring Boot Starter中自带的旧版ES依赖
在引入spring-boot-starter-data-elasticsearch时,排除掉它自动引入的旧版Elasticsearch依赖,避免版本冲突:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> <exclusions> <exclusion> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> </exclusion> <exclusion> <groupId>org.elasticsearch.client</groupId> <artifactId>transport</artifactId> </exclusion> <exclusion> <groupId>org.springframework.data</groupId> <artifactId>spring-data-elasticsearch</artifactId> </exclusion> </exclusions> </dependency> <!-- 手动引入正确版本的依赖 --> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-elasticsearch</artifactId> </dependency> <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> </dependency> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>transport</artifactId> </dependency> </dependencies>
4. 检查依赖树,排除其他冲突
如果还是有问题,用Maven命令查看依赖树,找出是否有其他依赖间接引入了旧版Elasticsearch:
mvn dependency:tree
找到冲突的依赖后,在对应的<dependency>节点中添加<exclusion>排除旧版ES即可。
5. 验证运行时配置
确保你的Elasticsearch客户端配置是适配5.6.3的,比如TransportClient的创建方式:
@Bean public TransportClient elasticsearchClient() throws UnknownHostException { Settings settings = Settings.builder() .put("cluster.name", "your-cluster-name") .build(); return new PreBuiltTransportClient(settings) .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300)); }
注意ES5.x的客户端和2.x的API有差异,比如PreBuiltTransportClient替代了旧的TransportClient构造方法。
内容的提问来源于stack exchange,提问作者dane131




