Spring Boot 2.2.1升级Hazelcast 4.0后Spring Session编译失败求解决方案
我之前在升级Spring Boot应用到Hazelcast 4.0时也踩过这个坑,刚好能帮到你!核心问题是你当前使用的spring-session-hazelcast版本和Hazelcast 4.0不兼容——Hazelcast 4.0把IMap这类核心API从com.hazelcast.core迁移到了com.hazelcast.map包,而旧版Spring Session Hazelcast还是引用的旧包路径,直接导致编译报错。
下面是具体的修复步骤:
1. 升级Spring Session Hazelcast到兼容版本
Spring Session Hazelcast 2.3.x及以上版本才正式支持Hazelcast 4.0。但你的Spring Boot 2.2.1默认依赖的是Spring Session 2.2.x(不兼容Hz4),所以需要手动指定spring-session-hazelcast的版本:
Maven项目,修改
pom.xml:<dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-hazelcast</artifactId> <version>2.3.2.RELEASE</version> <!-- 稳定兼容Hz4的版本 --> </dependency>Gradle项目,修改
build.gradle:implementation 'org.springframework.session:spring-session-hazelcast:2.3.2.RELEASE'
2. 锁定Hazelcast版本避免依赖冲突
Spring Boot 2.2.1默认的Hazelcast版本低于4.0,所以需要确保项目中Hazelcast的依赖是4.0,且不会被Spring Boot的依赖管理覆盖:
Maven,添加到
dependencyManagement:<dependencyManagement> <dependencies> <dependency> <groupId>com.hazelcast</groupId> <artifactId>hazelcast</artifactId> <version>4.0</version> </dependency> </dependencies> </dependencyManagement>Gradle,直接指定版本:
implementation 'com.hazelcast:hazelcast:4.0'
3. 调整自定义Hazelcast配置(如果有)
Hazelcast 4.0对部分API做了调整,如果你自定义了Hazelcast实例的配置(比如会话存储的IMap索引),需要适配新API:
比如之前的索引配置可能需要改成这样:
@Bean public HazelcastInstance hazelcastInstance() { Config config = new Config(); MapConfig sessionMapConfig = new MapConfig("spring:session:sessions"); // 适配Hazelcast 4.0的索引配置API sessionMapConfig.addIndexConfig(new IndexConfig(IndexType.HASH, "principalName")); sessionMapConfig.addIndexConfig(new IndexConfig(IndexType.HASH, "expireTime")); config.addMapConfig(sessionMapConfig); return Hazelcast.newHazelcastInstance(config); }
额外说明
Spring Session 2.3.x是兼容Spring Boot 2.2.x的,所以不用担心升级后和Spring Boot核心功能冲突。如果后续你把Spring Boot升级到2.3.x及以上,就不需要手动指定Spring Session的版本了,因为Spring Boot 2.3+默认依赖的Spring Session版本已经支持Hazelcast 4.0。
内容的提问来源于stack exchange,提问作者whistling_marmot

