java.lang.NoClassDefFoundError: org/springframework/data/redis/connection/zset/Tuple
·
java.lang.NoClassDefFoundError: org/springframework/data/redis/connection/zset/Tuple
在将 Spring Boot 项目部署到 Linux 环境时,可能会遇到如下错误:
org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.NoClassDefFoundError: org/springframework/data/redis/connection/zset/Tuple
一、问题现象
本地开发环境(如 macOS)项目运行一切正常,但部署到 Linux 服务器后,服务无法正常启动,报出上述异常。日志指向如下类:
org.redisson.spring.data.connection.RedissonConnection- 丢失的类:
org.springframework.data.redis.connection.zset.Tuple
二、原因分析
这个问题的根本原因在于 类冲突或版本不兼容。具体表现为:
- Redisson 的 Spring Data Redis 兼容包(
redisson-spring-boot-starter)依赖了 Spring Data Redis 中的某些类,例如Tuple。 - 在
redisson-spring-boot-starter:3.21.3版本中,它默认依赖的是 Spring Data Redis 3.0+ 的类结构。 - 然而项目中使用的是 Spring Data Redis 2.6.4,与之不兼容。
- 本地环境可能因为缓存或依赖冲突被隐藏了,而在 Linux 环境中以打包方式运行时,所有依赖严格以
jar为准,导致类找不到(NoClassDefFoundError)。
版本对应表(简略):
| redisson-spring-data-xx | 适配的 spring-data-redis 版本 |
|---|---|
| redisson-spring-data-21 | 2.1.x |
| redisson-spring-data-26 | 2.6.x |
| redisson-spring-data-30 | 3.x |
在错误中可以看到 redisson-spring-data-30-3.21.3.jar 被引入,而你使用的是 spring-data-redis:2.6.4,这就直接导致 org.springframework.data.redis.connection.zset.Tuple 无法解析。
三、解决方案
将 redisson-spring-boot-starter 降级为与 Spring Data Redis 2.6.4 兼容的版本,例如 3.17.1:
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
<version>3.17.1</version>
</dependency>
并重新打包部署即可解决。
四、建议
- 尽量保证第三方依赖版本之间的 兼容性,尤其是 Spring Boot、Spring Data、Redisson 等高度耦合的组件。
- 使用 Spring Initializr 生成项目时选择合适的版本搭配。
- 使用
mvn dependency:tree检查依赖冲突或传递依赖问题。
五、总结
Linux 环境报 NoClassDefFoundError 很多时候是依赖版本差异或类路径问题导致的。通过分析依赖结构与版本关系,最终将 redisson-spring-boot-starter 降级到兼容版本,问题得以解决。
更多推荐
所有评论(0)