排错小建议:nested exception is java.lang.NoClassDefFoundError: com/mysql/cj/exceptions或

文章主要讲述了在SpringBoot项目中遇到NoClassDefFoundError异常的两个情况,分别与ApacheiBatis和MySQL的驱动有关。作者建议检查项目和IDEA的JDK版本,确保两者与项目要求的JDK1.8一致,并提到即使项目正常打包,在某些情况下也可能出现此类问题。通过调整JDK版本,问题得到了解决。

在这里插入图片描述






nested exception is java.lang.NoClassDefFoundError: org/apache/ibatis/reflection/ExceptionUtilcom/mysql/cj/exceptions/ExceptionFactory



总结

如果项目在本地打包的,请将项目和IDEA的JDK版本都调整到至指定版本。如我的是JDK1.8



建议

建议1:检查项目默认的JDK版本(大部分伙伴应该已经设置)

调整至你项目开发规定的JDK版本
佛系的版本是1.8的,所以项目以及每个模块的版本我都调整至1.8
在这里插入图片描述

在这里插入图片描述

建议2:检查IDEA的默认版本(估计有一半的小伙伴这里应该没有设置

佛系就是踩了这个坑,一直没有注意IDEA默认的是JDK11版本
修改前 ↓
在这里插入图片描述
修改后 ↓,佛系修改了这里之后重新打包就解决上面的问题
在这里插入图片描述



问题1


Handler dispatch failed; nested exception is java.lang.NoClassDefFoundError: org/apache/ibatis/reflection/ExceptionUtil:	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1055)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:652)
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:733)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:113)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320)
	at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:118)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
	at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
	at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
	at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:158)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
	at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63)



问题2

Handler dispatch failed; nested exception is java.lang.NoClassDefFoundError: com/mysql/cj/exceptions/ExceptionFactory:	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1055)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:652)
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:733)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:113)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320)
	at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:118)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
	at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
	at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
	at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:158)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
	at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)



项目信息

SpringBoot项目
JDK版本:1.8
spring-boot-starter-parent:2.3.4.RELEASE
平时都是在本地打包好再推到服务器运行,运行一直都没问题。直至今天突然报错,然后毫无头绪。各种谷歌、百度,很多博客推荐在pom文件引入相关依赖,但是我认为pom文件缺失依赖可能性比较小。


佛系同时也跪求各位小伙伴有其他更好的解决方案或预防方案

<think>我们正在解决一个特定的错误:`java.lang.NoClassDefFoundError: org/springframework/data/redis/connection/zset/Tuple` 根据引用内容,这个错误通常是由于Spring Data Redis的版本不兼容依赖冲突引起的。具体来说,引用[1]提到在部署到Linux环境时遇到了这个错误,引用[2]和引用[3]则指出与Redisson和Spring Boot版本不兼容有关。 错误分析: 1. `NoClassDefFoundError`表示在编译时能找到这个类,但运行时找不到。具体来说,缺少`org.springframework.data.redis.connection.zset.Tuple`类。 2. 这个类是Spring Data Redis的一部分,通常存在于`spring-data-redis`库中。 3. 可能的原因: a) 项目中引入了不兼容的版本(例如,Redisson的starter包可能带来了不同版本的Spring Data Redis,导致冲突)。 b) 项目的依赖管理混乱,可能排错了版本。 根据引用[3]的解决方案,他们通过拆分依赖,即不使用`redisson-spring-boot-starter`,而是分别引入`spring-boot-starter-data-redis`和指定版本的`redisson`来解决。 具体解决方案: 步骤1:检查依赖树,排除冲突 使用MavenGradle查看依赖树,检查是否存在多个版本的`spring-data-redis`,以及是否与当前Spring Boot版本兼容。 例如,使用Maven命令: ```bash mvn dependency:tree ``` 步骤2:调整依赖 根据引用[3]的做法,我们可以将原来的redisson starter依赖替换为两个依赖:spring-boot-starter-data-redis和redisson(指定版本)。 原依赖(可能导致冲突): ```xml <dependency> <groupId>org.redisson</groupId> <artifactId>redisson-spring-boot-starter</artifactId> <version>3.21.1</version> </dependency> ``` 替换为: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>3.20.0</version> <!-- 选择一个合适的版本,确保与Spring Boot版本兼容 --> </dependency> ``` 注意:Redisson的版本需要与Spring Boot版本匹配。例如,对于Spring Boot 2.4.x,可以使用Redisson 3.15.0;对于Spring Boot 2.3.x,可以使用Redisson 3.14.1等。具体可参考Redisson的官方文档。 步骤3:确保版本兼容 在Spring Boot项目中,通常不需要单独指定`spring-data-redis`的版本,因为Spring Boot的starter已经管理了版本。但是,如果使用了Redisson,需要确保Redisson的版本与Spring Boot的版本兼容。 步骤4:清理和重新构建 在修改依赖后,执行清理并重新构建项目: ```bash mvn clean install ``` 者使用Gradle: ```bash gradle clean build ``` 步骤5:验证 重新启动应用程序,验证是否还有该错误。 如果问题仍然存在,可以考虑显式指定`spring-data-redis`的版本,确保与当前Spring Boot版本一致。例如,在Maven中: ```xml <properties> <spring-data-redis.version>2.5.8</spring-data-redis.version> <!-- 根据Spring Boot版本确定 --> </properties> ``` 但通常Spring Boot的parent POM已经管理了这些版本,所以最好通过调整Redisson的版本来解决。 引用[2]提到,Redisson的starter对Spring Boot版本有要求,最新版本的starter通常要求Spring Boot 2.3及以上。因此,如果使用的是Spring Boot 2.3以下,就需要降低Redisson starter的版本,者采用上述拆分依赖的方式。 结论:这个错误最常见的原因是`redisson-spring-boot-starter`与当前项目的Spring Boot版本不兼容。解决方法就是拆分依赖,并分别引入合适的版本。 最后,如果以上方法都不能解决,请检查是否还有其他依赖引入了不兼容的`spring-data-redis`版本,并尝试排除。 相关问题: 1. 如何解决Spring Boot中的依赖版本冲突? 2. 如何确定Redisson与Spring Boot的兼容版本? 3. 如何排除Maven依赖中的冲突版本? 4. Spring Data Redis中Tuple类的用途是什么? </think>### 解决 `java.lang.NoClassDefFoundError: org/springframework/data/redis/connection/zset/Tuple` 错误 #### 错误原因分析 该错误表示 JVM 在运行时找不到指定的类 `Tuple`(位于 `org.springframework.data.redis.connection.zset` 包中)。根本原因是 **依赖版本冲突**,常见于以下场景: 1. **版本不兼容** Spring Boot 与 Spring Data Redis 版本不匹配, Redisson 与 Spring Boot 版本不兼容(常见于 Spring Boot < 2.3.x) 2. **依赖冲突** 同时引入冲突的依赖: ```xml <!-- 冲突组合 --> <dependency> <groupId>org.redisson</groupId> <artifactId>redisson-spring-boot-starter</artifactId> <!-- 可能覆盖Spring Data Redis版本 --> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> ``` 3. **类路径问题** 打包时缺少必要的类文件(常见于特殊部署环境如 Linux) --- #### 解决方案 ##### 方法一:调整依赖版本(推荐) 修改 `pom.xml`,使用兼容的依赖组合: ```xml <!-- 移除冲突的starter --> <!-- <dependency> <groupId>org.redisson</groupId> <artifactId>redisson-spring-boot-starter</artifactId> </dependency> --> <!-- 使用标准组合 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>3.20.0</version> <!-- 兼容旧版Spring Boot --> </dependency> ``` ##### 方法二:强制指定 Spring Data Redis 版本 在 `pom.xml` 中添加版本锁定: ```xml <properties> <spring-data-redis.version>2.7.0</spring-data-redis.version> </properties> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> ``` ##### 方法三:排查依赖冲突 使用 Maven 分析依赖树: ```bash mvn dependency:tree -Dincludes=org.springframework.data:spring-data-redis ``` 检查输出中是否存在多个版本,例如: ``` [INFO] | +- org.springframework.data:spring-data-redis:jar:2.5.8 (version managed from 2.7.0) [INFO] | \- org.redisson:redisson-spring-data-23:jar:3.21.0 -> 携带不兼容版本 ``` 通过 `<exclusions>` 排除冲突版本: ```xml <dependency> <groupId>org.redisson</groupId> <artifactId>redisson-spring-boot-starter</artifactId> <exclusions> <exclusion> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> </exclusion> </exclusions> </dependency> ``` ##### 方法四:验证部署包完整性 检查打包后的 JAR/WAR 是否包含缺失类: ```bash # 解压部署包 jar -xf your-app.jar # 检查类是否存在 find BOOT-INF/lib -name "spring-data-redis-*.jar" | xargs grep -l "zset/Tuple" ``` 若缺失,需检查构建配置(确保 `maven-compiler-plugin` 未过滤依赖)。 --- #### 版本兼容参考表 | Spring Boot 版本 | 兼容 Redisson 版本 | 兼容 Spring Data Redis 版本 | |------------------|---------------------|------------------------------| | 2.1.x - 2.2.x | 3.10.x - 3.15.x | 2.1.x - 2.2.x | | 2.3.x - 2.4.x | 3.16.x - 3.18.x | 2.3.x - 2.4.x | | 2.5.x+ | 3.20.x+ | 2.5.x+ | > **注意**:`Tuple` 类在 Spring Data Redis 2.0+ 稳定存在,版本冲突是主因[^1][^3]。 --- #### 验证修复 创建测试类验证 Redis 连接: ```java @SpringBootTest public class RedisConnectionTest { @Autowired private RedisTemplate<String, String> redisTemplate; @Test void testZsetOperations() { // 验证 Tuple 类相关功能 redisTemplate.opsForZSet().add("testKey", "value", 1.0); Set<ZSetOperations.TypedTuple<String>> result = redisTemplate.opsForZSet().rangeWithScores("testKey", 0, -1); assertNotNull(result); // 通过则无类缺失 } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值