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

Spring Boot 2.1.8升级至2.3.4后启动失败:类路径方法不存在问题

解决Spring Boot升级后Hibernate Search与Elasticsearch依赖冲突问题

第一个错误的核心原因:版本不兼容

你遇到的第一个启动错误,本质是Hibernate Search 5.11.2.Final 和 Elasticsearch Rest Client 7.6.2 版本完全不匹配。Hibernate Search 5.x系列是为Elasticsearch 5.x~6.x设计的,它调用的setMaxRetryTimeoutMillis(I)方法在Elasticsearch 7.x的RestClientBuilder中已经修改了方法签名(参数从int改为long),自然会出现"方法不存在"的报错。

另外你的依赖树里还有个隐藏问题:elasticsearch-rest-client-sniffer:5.6.8版本和7.6.2的rest-client版本不一致,sniffer作为客户端的辅助组件,必须和rest-client版本完全对齐,否则也会埋下兼容性隐患。

第二个错误的核心原因:新旧Hibernate Search版本共存

你后来添加了Hibernate Search 6的依赖,但没移除原来的5.11.2版本,导致项目中同时存在hibernate-search-engine:5.11.2.Final6.0.0.Beta3两个版本的核心包。类加载器加载时优先选择了其中一个版本,但代码调用的是另一个版本的方法,最终出现了Version.touch()方法找不到的冲突。

具体解决方案

按以下步骤彻底清理依赖并配置兼容版本:

  1. 彻底移除所有Hibernate Search 5.x依赖
    在pom.xml中找到并删除org.hibernate:hibernate-search-elasticsearch:5.11.2.Final依赖,同时检查其他依赖是否间接引入了Hibernate Search 5.x的包,必要时添加排除规则:

    <!-- 示例:如果是Spring Boot Starter间接引入,添加排除 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-search-elasticsearch</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-search-engine</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    
  2. 添加兼容的Hibernate Search 6正式版依赖
    Spring Boot 2.3.x使用的是Hibernate ORM 5.4.x,对应兼容的Hibernate Search版本是6.0.x正式版(Beta版稳定性差,不建议生产使用),添加以下依赖:

    <!-- Hibernate Search ORM核心映射包 -->
    <dependency>
        <groupId>org.hibernate.search</groupId>
        <artifactId>hibernate-search-mapper-orm</artifactId>
        <version>6.0.1.Final</version>
    </dependency>
    <!-- Elasticsearch后端实现 -->
    <dependency>
        <groupId>org.hibernate.search</groupId>
        <artifactId>hibernate-search-backend-elasticsearch</artifactId>
        <version>6.0.1.Final</version>
    </dependency>
    
  3. 统一Elasticsearch客户端版本
    Hibernate Search 6.0.x适配Elasticsearch 7.0~7.10版本,确保所有Elasticsearch相关依赖版本一致,推荐使用7.10.2(和Hibernate Search 6.0.1兼容性最佳):

    <dependency>
        <groupId>org.elasticsearch.client</groupId>
        <artifactId>elasticsearch-rest-client</artifactId>
        <version>7.10.2</version>
    </dependency>
    <dependency>
        <groupId>org.elasticsearch.client</groupId>
        <artifactId>elasticsearch-rest-client-sniffer</artifactId>
        <version>7.10.2</version>
    </dependency>
    
  4. 验证依赖树
    执行以下命令确认依赖清理完成:

    ./mvnw dependency:tree -Pwar | grep elasticsearch
    ./mvnw dependency:tree -Pwar | grep hibernate-search
    

    确保输出中没有同时存在5.x和6.x的Hibernate Search依赖,且所有Elasticsearch相关依赖版本统一。

额外注意点

  • Hibernate Search 6相对于5.x有不少API变化,如果你的代码直接使用了Hibernate Search 5的注解或查询API,需要做少量适配(比如@Indexed注解的参数调整、查询DSL的写法变化)。
  • Spring Boot 2.3.x的依赖管理中没有内置Hibernate Search 6的版本,所以必须明确指定版本号,避免依赖自动引入不一致的版本。

内容的提问来源于stack exchange,提问作者Lansorian

火山引擎 最新活动