spring boot 版本决定 spring-data-redis 版本,手动覆盖会破坏依赖契约,导致 nosuchmethoderror 或 noclassdeffounderror;正确做法是让 redisson 等组件适配 boot 版本,而非反向修改 spring-data-redis。

直接结论:Spring Boot 的版本决定了它自带的 spring-data-redis 版本,不能手动覆盖;强行指定不匹配的 spring-data-redis 会导致 NoSuchMethodError 或 NoClassDefFoundError。
为什么改了 spring-data-redis 版本反而启动失败?
Spring Boot 的 spring-boot-starter-data-redis 是一个“bom 驱动型” starter,它内部通过 spring-boot-dependencies 管理了 spring-data-redis、lettuce-core、jedis 等所有子依赖的精确版本。你手动在 pom.xml 中写死 spring-data-redis 版本,会破坏这个契约。
常见错误现象:
-
java.lang.NoSuchMethodError: org.springframework.data.redis.connection.RedisConnection.set([B[B)V(方法签名在 2.7.x 和 3.x 间已变) -
Caused by: java.lang.ClassNotFoundException: org.springframework.data.redis.core.RedisTemplate(版本错配导致类加载失败) - 编译正常、启动成功,但第一次调用
RedisTemplate就抛异常
怎么查当前项目实际使用的 spring-data-redis 版本?
别猜,用 Maven 命令直接看真实解析结果:
mvn dependency:tree -Dincludes=org.springframework.data:spring-data-redis
输出中会明确显示类似:
[INFO] \- org.springframework.data:spring-data-redis:jar:2.7.8:compile
这个 2.7.8 就是 Spring Boot 2.7.3 实际锁定的版本 —— 它由 spring-boot-dependencies:2.7.3 决定,不是你写的那个 <version></version>。
关键点:
- Spring Boot 2.7.x → 对应
spring-data-redis2.7.x(如 2.7.3 ~ 2.7.12) - Spring Boot 3.0+ → 对应
spring-data-redis3.x(要求 Jakarta EE 9+,JDK 17+) - 没有 2.7.x + 3.x 混搭的合法路径;跨主版本必须整体升级
真正有效的版本对齐操作
如果你用的是 Spring Boot 2.7.3,就老老实实接受它带的 spring-data-redis:2.7.8。需要“对齐”,其实是让其他组件(比如 Redisson)去适配它,而不是反过来。
正确做法:
- 删掉所有手动声明的
spring-data-redis依赖项 - 确认
spring-boot-starter-data-redis是唯一入口,不加<exclusions></exclusions>除非你清楚后果 - 若集成 Redisson,选对应 Spring Boot 主版本的 starter:
— Spring Boot 2.7.x → 用redisson-spring-boot-starter:3.16.8(它内部依赖redisson-spring-data-2x)
— Spring Boot 3.2.x → 用redisson-spring-boot-starter:3.24.0+(依赖redisson-spring-data-3x) - 必要时用
<dependencymanagement></dependencymanagement>统一管理redisson-spring-boot-starter版本,避免模块间传递冲突
最容易被忽略的兼容性断点
很多人只盯着 spring-data-redis,却漏掉了底层客户端的隐式绑定:
- Lettuce 6.x 是 Spring Boot 2.7 默认绑定的,但它要求 Netty 4.1.90+;而某些旧版 Redisson(如 3.15.x)自带 Netty 4.1.73,运行时可能触发
IllegalAccessError - Jedis 4.x 只支持 Spring Boot 3.x,用在 2.7.x 上会因方法缺失直接启动失败
- Redis 服务器本身也有影响:Redis 3.2 不支持
ACL,但 Spring Boot 2.7 的 Lettuce 客户端默认尝试发ACL LOAD命令,导致连接重置 —— 这种问题看似是版本错,实则是协议能力不匹配
所以,“对齐版本”的本质,是让整个链条(Boot → Data Redis → Client → Redis Server)的能力边界互相包容,而不是机械地拉平某个 pom 里的数字。











