Redisson 与 Spring Boot 版本冲突 3 步排查指南:快速定位启动报错
【免费下载链接】redissonRedisson: Valkey & Redis Java Client and Real-Time Data Platform. Sync/Async/RxJava/Reactive API. Over 50 Valkey and Redis based Java objects and services: Set, Multimap, SortedSet, Map, List, Queue, Deque, Semaphore, Lock, AtomicLong, Map Reduce, Bloom filter, Spring, Tomcat, Scheduler, JCache API, Hibernate, RPC, local cache..项目地址: https://gitcode.com/GitHub_Trending/re/redisson
Redisson 是一个 Valkey 与 Redis 的 Java 客户端(即用来连接和操作 Redis 缓存的 Java 库),提供分布式锁、Map、队列等 50 多种基于 Redis 的 Java 对象与服务。把它接入 Spring Boot 项目时,最常见的拦路虎就是版本冲突:依赖看似加对了,应用却在启动阶段直接报错。本文以一次真实的NoClassDefFoundError为例,带你走一遍从报错到修复的完整排查路径。
先看一个典型的报错现场
某次把 Spring Boot 从 2.7 升到 3.3 后,应用启动失败,日志里出现类似这样的异常:
java.lang.NoClassDefFoundError: org/springframework/boot/autoconfigure/redis/RedisProperties at org.redisson.spring.starter.RedissonAutoConfiguration.<clinit>(注意:Spring Boot 2.x 时代该类在...autoconfigure.redis包下,3.x 移到了...autoconfigure.data.redis包下,类路径变化是这类报错的高发原因。)
这个错误的直接含义是:JVM 在加载 Redisson 的 Spring 自动配置类时,发现它引用的 Spring Boot 自动配置类在 classpath 里不存在。如果你的报错是ClassNotFoundException或NoSuchMethodError,本质上也属于同一类问题。
为什么冲突总发生在 redisson-spring-data 上
Redisson 的 Spring Boot 启动器 redisson-spring-boot-starter 并不是单一依赖,它内部还依赖一个redisson-spring-data模块。这个模块是按 Spring Boot 的大版本号拆分的:Boot 1.x 对应redisson-spring-data-1x,2.x 对应-20到-27,3.x 对应-30到-35,4.x 对应-40、-41(具体对应关系以官方文档为准,见 Spring 集成文档)。
启动器默认携带的是适配最新 Spring Boot 版本的模块。也就是说,如果你的项目跑在 Spring Boot 2.x,而 classpath 里却是-40模块,两边对 Spring Data Redis API 的调用方式不一致,就会在类加载或方法调用阶段炸掉。这就是为什么"版本明明都是最新的"却仍然冲突——问题不在 Redisson 本体,而在这个被传递依赖带进来的 spring-data 模块上。
自动配置的入口在 RedissonAutoConfiguration.java,里面还按 Boot 版本拆分了 V2、V4 等变体,通过@ConditionalOnMissingClass之类的注解自动选择生效哪一个。理解这一点后,排查思路就清晰了:先确认 Boot 版本,再核对 spring-data 模块版本是否匹配。
确认项目实际生效的 Spring Boot 版本
不要只看 pom.xml 里写的版本,传递依赖可能悄悄把它抬高了。在 Maven 项目中执行:
mvn dependency:tree -Dincludes=org.springframework.boot | grep spring-boot看输出中实际解析到的版本。如果你用多模块工程或 BOM(依赖版本统一管理文件),还要确认dependencyManagement里的约束是否覆盖了 starter 引入的版本。Gradle 项目则用./gradlew dependencies --configuration runtimeClasspath | grep spring-boot查看。
核对并替换 redisson-spring-data 模块
确认 Boot 版本后,执行依赖树分析,把 redisson 相关的依赖全部列出来:
mvn dependency:tree | grep redisson重点检查是否同时存在两个redisson-spring-data-*模块,或者模块编号与你的 Boot 大版本对不上。修复方式是排除 starter 默认带入的模块,显式声明匹配的那个。以 Boot 2.7 项目为例,排除-40并引入-27:
<dependency> <groupId>org.redisson</groupId> <artifactId>redisson-spring-boot-starter</artifactId> <version>xVERSIONx</version> <exclusions> <exclusion> <groupId>org.redisson</groupId> <artifactId>redisson-spring-data-40</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.redisson</groupId> <artifactId>redisson-spring-data-27</artifactId> <version>xVERSIONx</version> </dependency>版本占位符记得替换成你实际使用的 Redisson 版本。改完后重新执行一遍依赖树命令,确认 spring-data 模块只剩一个且编号匹配,再启动应用验证。
让版本匹配写进工程约定,避免反复踩坑
修好只是第一步。建议在项目的 pom 顶层用dependencyManagement统一锁定 redisson 全家桶(starter、spring-data、核心包)的版本号,保证所有模块走同一版本,杜绝"starter 是新版、spring-data 被别的依赖带成旧版"的情况。同时升级 Spring Boot 时,把"核对 redisson-spring-data 模块编号"列入检查清单,因为 Boot 跨大版本(2.x 到 3.x、3.x 到 4.x)时,该类路径调整几乎必然要求换模块。
最后提醒一点:以上兼容矩阵基于当前仓库代码整理,Redisson 迭代较快,具体版本对应关系请以官方文档为准。
【免费下载链接】redissonRedisson: Valkey & Redis Java Client and Real-Time Data Platform. Sync/Async/RxJava/Reactive API. Over 50 Valkey and Redis based Java objects and services: Set, Multimap, SortedSet, Map, List, Queue, Deque, Semaphore, Lock, AtomicLong, Map Reduce, Bloom filter, Spring, Tomcat, Scheduler, JCache API, Hibernate, RPC, local cache..项目地址: https://gitcode.com/GitHub_Trending/re/redisson
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考