-
本人第一篇博客,开始的有点晚,惭愧!
-
因疫情影响,在家远程办公,效率不高,遇到springboot项目在linux环境下项目启动报错问题,而该问题在windows环境下正常,无法调试,百度也不能直接找到答案,经过一天时间的分析和不断尝试,终于解决了,长舒一口气,借此机会和平台,记录一下解决思路,供大家参考。
具体报错如下:
Caused by: java.lang.NoClassDefFoundError: org/springframework/data/redis/connection/RedisStreamCommands
at org.redisson.spring.data.connection.RedissonConnectionFactory.getConnection(RedissonConnectionFactory.java:102) ~[redisson-spring-data-22-3.11.6.jar!/:3.11.6]
at org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration$EnableRedisKeyspaceNotificationsInitializer.afterPropertiesSet(RedisHttpSessionConfiguration.java:302) ~[spring-session-data-redis-2.1.7.RELEASE.jar!/:2.1.7.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1837) ~[spring-beans-5.1.8.RELEASE.jar!/:5.1.8.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1774) ~[spring-beans-5.1.8.RELEASE.jar!/:5.1.8.RELEASE]
... 24 common frames omitted
思路:
- 首先,找到第二行RedissonConnectionFactory.java:102这段代码追踪,发现和第一行和第三行的错误联系不上。
- 接着,分析第一行Caused by: java.lang.NoClassDefFoundError:
org/springframework/data/redis/connection/RedisStreamCommands,意思是Java虚拟机不能找到合适的类:org/springframework/data/redis/connection/RedisStreamCommands,查看项目用到的jar包spring-data-redis-2.1.9.RELEASE.jar,发现确实没有该类,马上下载高等级包,发现spring-data-redis2.2.1及以上版本的包含有该类,从而尝试将pom文件的spring-data-redis的版本改为2.2.1,发现项目引用的还是2.1.9的老包,经分析,项目用到的是springboot是2.1.6版本所以导致子包spring-data-redis最高版本为2.1.9,再尝试修改pom将springboot版本升级,发现有很多类会报错,考虑到springboot版本升级关联性太强从而“另谋他法”。- 然后,拿上次linux正常运行的包的pom和现在pom对比,发现新增了分布式锁redisson-spring-boot-starter3.11.6,与报错的第二行也对应上了,分析原因是3.11.6版本的分布式锁用到了类RedisStreamCommands,于是,尝试给分布式锁降级,果然降到3.10.6版本后,在linux成功运行!
欢迎大家提出宝贵意见!