一、写在前面
Redisson最新版本,大概3.47.0,在JDK8环境下(实测JDK17也一样)会提示Netty的某些类找不到:
Exception in thread "main" java.lang.NoClassDefFoundError: io/netty/channel/unix/DomainSocketChannel
at org.redisson.client.RedisClient.createBootstrap(RedisClient.java:142)
at org.redisson.client.RedisClient.<init>(RedisClient.java:127)
at org.redisson.client.RedisClient.create(RedisClient.java:84)
at org.redisson.connection.MasterSlaveConnectionManager.createClient(MasterSlaveConnectionManager.java:341)
at org.redisson.connection.MasterSlaveConnectionManager.connectToNode(MasterSlaveConnectionManager.java:121)
at org.redisson.connection.MasterSlaveConnectionManager.connectToNode(MasterSlaveConnectionManager.java:108)
at org.redisson.connection.ClusterConnectionManager.doConnect(ClusterConnectionManager.java:97)
at org.redisson.connection.MasterSlaveConnectionManager.connect(MasterSlaveConnectionManager.java:188)
at org.redisson.connection.ConnectionManager.create(ConnectionManager.java:98)
at org.redisson.Redisson.<init>(Redisson.java:76)
at org.redisson.Redisson.create(Redisson.java:119)
at com.demo.springbootdemo.SpringbootDemoApplication.main(SpringbootDemoApplication.java:25)
Caused by: java.lang.ClassNotFoundException: io.netty.channel.unix.DomainSocketChannel
at java.net.URLClassLoader.findClass(URLClassLoader.java:387)
at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352)
at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
... 12 more
二、解决方案
1、解决方案
是因为缺少 Netty 相关的 Unix 域套接字依赖包。
Netty 的 Unix 域套接字支持位于独立的 netty-transport-native-unix-common
包中,而 Redisson 某些功能(如对 Unix 域套接字的支持)依赖于此包。解决方法是在项目依赖中添加对应的 Netty 原生传输包。
如果是 Maven 项目,可添加以下依赖:
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-transport-native-unix-common</artifactId>
<version>4.1.77.Final</version> <!-- 版本需与Redisson依赖的Netty版本匹配 -->
</dependency>
如果是 Gradle 项目,可添加:
implementation 'io.netty:netty-transport-native-unix-common:4.1.77.Final'
注意:Netty 版本需要与 Redisson 3.50.0 所依赖的 Netty 版本保持一致(Redisson 3.50.0 通常依赖 Netty 4.1.77 系列)
,建议通过查看项目依赖树确认具体版本后再添加,避免版本冲突。
2、一劳永逸
如果报错不是提示这个错误,而是别的类找不到,可以考虑直接引入netty-all
:
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.77.Final</version>
</dependency>
一定要注意netty的版本!!!