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 降级到兼容版本,问题得以解决。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐