深渊巨坑!!!关于若依项目使用RedisUtil报错java.lang.ClassNotFoundException: org.springframework.data.redis.core.RedisTemplate

问题概述

事情是这样的,每周例行代码合并的时候同事提上来一个redisUtil

在他本地没事,但是在我机器上启动报错

1
java.lang.ClassNotFoundException:org.springframework.data.redis.core.RedisTemplate

起初以为redis依赖问题,ai也是这么提示的:不是代码写错,而是 jar 没引;把 spring-boot-starter-data-redis +commons-pool2 加进来,启动立刻好 —— kimi

然后我就顺着这个思路做了如下操作:

  1. 删除spring-boot-starter-data-redis版本指定

  2. 添加commons-pool2依赖

  3. 查看两个包之间的依赖关系

  4. 通过mvn dependency:tree | Select-String redis查看redis是否引入

    依赖已经成功引入:

    1
    2
    3
    4
    5
    PS C:\Users\Administrator\Desktop\nh-mistake-note-book\notebook-framework> mvn dependency:tree | Select-String redis
    [INFO] | | | +- io.netty:netty-codec-redis:jar:4.1.92.Final:compile
    [INFO] +- org.springframework.boot:spring-boot-starter-data-redis:jar:2.5.15:c
    ompile
    [INFO] | \- org.springframework.data:spring-data-redis:jar:2.5.12:compile

问题排查到这里就要感谢“通义”大佬给出的如下建议:

❓那为什么还会报 java.lang.ClassNotFoundException: org.springframework.data.redis.core.RedisTemplate

既然依赖存在,问题几乎可以确定不是 Maven 依赖缺失,而是以下 运行时环境或类加载问题

🔍 最可能的原因:Spring Boot DevTools 的重启类加载器(RestartClassLoader)隔离问题

你在错误日志中看到的是:

1
java.lang.ClassNotFoundException: org.springframework.data.redis.core.RedisTemplate   at java.net.URLClassLoader...   at org.springframework.boot.devtools.restart.classloader.RestartClassLoader...

这明确表明:

  • 应用使用了 Spring Boot DevTools
  • DevTools 启用了“热重启”(LiveReload),它会创建一个 隔离的 RestartClassLoader
  • 某些 JAR(尤其是本地模块如 notebook-common/framework)未被正确加载进 RestartClassLoader 的 classpath

🧠 原理简述:

DevTools 默认只将 项目主模块(如 notebook-admin) 及其直接依赖视为“可重启类”,而 多模块项目中的内部模块(如 notebook-framework)可能被排除在外,导致 RedisUtil 能编译通过,但运行时找不到 RedisTemplate(因为 framework 模块的类被 RestartClassLoader 加载,而 RedisTemplate 被 AppClassLoader 加载,或反之,造成不一致)。

解决方法

在admin包中将**spring-boot-devtools**暂时移除

成功运行!