工作中业务模块在使用netty时遇到NoClassDefFoundError报错,经排查,是因为工具模块中spring-redis-lettuce下依赖了netty部分高版本的包而导致了版本冲突。解决方法为排除lettuce依赖而采用jedis依赖,使得项目中netty版本保持一致。
目录
1.报错日志
报错如下:
Caused by: java.lang.ClassNotFoundException: io.netty.internal.tcnative.SSLPrivateKeyMethod
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(LaunchedURLClassLoader.java:93)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
2.排查过程
通过Maven插件排查后发现,业务模块中使用的netty版本,与common模块中的netty版本不一致。
common模块中spring下redis里依赖了较高版本的netty包。
采用jedis依赖来避免netty版本冲突,使用jedis的同时排除lettuce依赖。
<!-- redis 缓存操作 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>1.4.0.RELEASE</version>
<exclusions>
<exclusion>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
3.插件推荐
排查过程中使用了一款idea插件Maven Helper,推荐Maven项目使用管理。
安装以后打开项目中的pom文件,左下角部分既可切换Dependency Analyzer页卡来进行操作。
总结
日常开发工作中,尤其是各模块间调用较为紧密的情况。要注意依赖包的版本问题,冲突可能直接导致项目不可启动与业务崩溃。