Spring Boot 2.1.8升级至2.3.4后启动失败:类路径方法不存在问题
第一个错误的核心原因:版本不兼容
你遇到的第一个启动错误,本质是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.Final和6.0.0.Beta3两个版本的核心包。类加载器加载时优先选择了其中一个版本,但代码调用的是另一个版本的方法,最终出现了Version.touch()方法找不到的冲突。
具体解决方案
按以下步骤彻底清理依赖并配置兼容版本:
彻底移除所有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>添加兼容的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>统一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>验证依赖树
执行以下命令确认依赖清理完成:./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




