You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Spring Boot 1.5.7集成Elasticsearch 5.6.3依赖冲突及异常求助

解决Spring Boot 1.5.7 + spring-data-elasticsearch 3.0.2 + Elasticsearch 5.6.3的版本冲突问题

我之前也踩过Spring Boot和Elasticsearch版本兼容的坑,你的问题核心在于Spring Boot的依赖管理机制会强制统一子依赖版本,再加上spring-data-elasticsearch和Elasticsearch本身有严格的版本对应关系,直接改版本很容易出问题。下面给你一步步拆解解决:

问题根源

  1. 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包。
  2. 当你强制把Elasticsearch改成5.6.3时,spring-data-elasticsearch 3.0.2需要的Elasticsearch客户端依赖(比如transportrest-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

火山引擎 最新活动