Redisson 与 Netty 版本冲突会导致 NoClassDefFoundError 或 IllegalAccessError,根本原因是 Redisson 默认依赖 Netty 4.1.x 而 Spring Boot 3.x 等组件使用 4.2+;盲目 exclude 会引发 NoSuchMethodError;应通过 netty-bom 统一版本(如 4.1.100.Final),并显式配置 EventLoopGroup 避免线程泄漏。

Redisson 与 Netty 版本冲突的典型现象
直接启动报 NoClassDefFoundError 或 IllegalAccessError,常见于 io.netty.util.internal.PlatformDependent、io.netty.channel.EventLoopGroup 等类;Spring Boot 项目里加了 redisson-spring-boot-starter 后 WebFlux 或 Netty-based 客户端(如 WebClient、gRPC)突然无法初始化——本质是 Redisson 自带的 Netty 依赖(默认 4.1.x)和你项目里其他组件拉进来的 Netty(比如 Spring Boot 3.x 默认用 4.2+)不兼容。
为什么不能简单 exclude netty 依赖
Redisson 对 Netty 有强绑定,不同版本间 API 差异大,比如 EventLoopGroup 构造参数、ChannelOption 的泛型约束、甚至 ByteBuf 的内存模型都可能变。盲目 exclude group="io.netty" 会导致 RedissonClient 初始化失败,抛出 java.lang.NoSuchMethodError 或空指针。
- Redisson 3.24+ 依赖 Netty 4.1.100+,但已开始适配 4.2
- Spring Boot 3.2+ 内置 Netty 4.2.0+,且 WebClient 默认使用
ReactorResourceFactory创建EventLoopGroup - gRPC Java 1.60+ 要求 Netty ≥ 4.1.97,但部分 API 在 4.2 中被迁移或废弃
用 BOM 统一管理 Netty 版本(Maven)
核心思路:不靠逐个 exclude,而是用 netty-bom 锁定整个 Netty 生态的版本,让 Redisson 和其他组件共用同一套 Netty 坐标。BOM 本身不引入代码,只声明版本约束,对传递依赖生效。
在 pom.xml 的 <dependencymanagement></dependencymanagement> 中声明:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-bom</artifactId>
<version>4.1.100.Final</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
注意:4.1.100.Final 是目前 Redisson 3.24.x 兼容性最稳的版本;若你必须用 Netty 4.2,则需确认 Redisson 版本 ≥ 3.25.0(尚未 GA),否则大概率失败。
- 确保
netty-bom声明在所有其他依赖之前(BOM 优先级高) - 不要同时引入多个 Netty BOM(如再加
spring-boot-dependencies的 bom),避免版本覆盖冲突 - 执行
mvn dependency:tree -Dincludes=io.netty验证最终解析出的 Netty jar 是否全为同一版本
Redisson 自定义 EventLoopGroup 的必要性
即使 Netty 版本统一,Redisson 默认创建的 NioEventLoopGroup 仍可能与主线程池或 Web 容器的生命周期冲突,尤其在 Spring Boot 测试或热部署场景下引发资源泄漏。这不是版本问题,而是线程模型设计问题。
- 显式配置
eventLoopGroup可复用已有线程池,例如接入 Spring 的TaskExecutor - 避免 Redisson 在 shutdown 时未正确关闭
EventLoopGroup,导致 JVM 无法退出 - 示例配置片段(Java Config):
Config config = new Config();
config.useSingleServer().setAddress("redis://127.0.0.1:6379");
// 复用 Spring 管理的 NIO 线程池
config.setEventLoopGroup(new NioEventLoopGroup(4, springExecutor));
RedissonClient client = Redisson.create(config);
这里 springExecutor 必须是 ThreadFactory-aware 的,否则 Netty 会忽略并新建线程组。
真正麻烦的从来不是“怎么排除 Netty”,而是“哪个 Netty 版本能同时喂饱 Redisson、WebClient、gRPC 和你的自定义 Netty handler”。BOM 是起点,不是终点;线程模型对齐才是生产环境不出问题的关键。


















