摘要
本文记录了解决 Maven 依赖冲突导致的 NoSuchMethodError 问题的过程。问题出现的原因是多个库包含了 Jackson 库,导致 Jackson 序列化与反序列化时出现 NoSuchMethodError 异常。通过查看依赖树,排除冲突库的方法,最终成功解决了该问题。
问题
Redis进行缓存对象时,代码报错,报错的代码如下:
实体类的字段
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
控制台如下:
java.lang.NoSuchMethodError: com.fasterxml.jackson.datatype.jsr310.ser.JSR310FormattedSerializerBase.findFormatOverrides
我拿这个错误问ChatGPT,它的回答如下:
这个错误出现的原因是你正在尝试调用一个在你所使用的库版本中不存在的方法。具体来说,看起来你正在尝试从com.fasterxml.jackson.datatype.jsr310.ser包中的JSR310FormattedSerializerBase类调用findFormatOverrides方法,但是你所使用的库版本中没有这个方法。
这个错误的可能原因之一是你正在使用一个过时的Jackson库版本,该版本不包括这个方法。要修复这个错误,你可以尝试将Jackson库更新到包含findFormatOverrides方法的更近期的版本。
另一个可能性是你的类路径上有多个Jackson库版本,而你的代码使用的版本不包括findFormatOverrides方法。要修复这个错误,你可以尝试从你的类路径中删除旧版本的Jackson库。
如果你正在使用像Maven或Gradle这样的构建工具,你可以检查你的依赖树,看看你正在使用哪个版本的Jackson库,以及哪些其他库依赖于它。这可以帮助你识别不同库之间的任何冲突或兼容性问题。
总的来说,NoSuchMethodError是一个运行时错误,当你尝试调用在你所使用的库版本中不存在的方法时会出现。要修复这个错误,你需要确保你使用了正确的库版本,并且在你的类路径上没有任何冲突或兼容性问题。
解决过程
确定了是Maven依赖冲突的问题,接下来去解决它。
查看依赖树
借助Maven Helper
这个插件去排查问题。
打开pom.xml
,点击Text
右边的依赖分析
,搜索jackson
查看有哪些库依赖了jackson通过查看各个jackson依赖发现,jackson-databind
有两个库存在jackson-databind
,分别是spring-boot-starter-actuator
和spring-boot-starter-web
,我们只需一个即可,需要排除其中的一个,我选择排除actuator。
排除冲突库
找到actuator依赖所在pom的位置,查看这个库依赖了jackson的哪些东西,我们全都排除
发现依赖了jackson库的两个东西,因为这个jackson库是重复的,是冲突,需要去做排除
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<exclusions>
<exclusion>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
</exclusion>
<exclusion>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</exclusion>
</exclusions>
</dependency>
结果
解决完冲突之后,启动应用,Redis缓存对象时正常。
"createTime": "2023-03-21 16:58:25"
总结
当开发过程中出现依赖冲突时,可能会导致NoSuchMethodError等运行时异常。下面是一些总结:
1、导致依赖冲突的原因多种多样,比如引入多个版本的同一依赖库、依赖库之间存在版本兼容性问题等等。
2、在遇到NoSuchMethodError等运行时异常时,要仔细分析错误信息,定位到出错的类和方法,找出与之相关的依赖库。
3、查看依赖树是排除依赖冲突的一种有效方法,可以用Maven等工具来查看依赖树,找出冲突的依赖库,并根据需要进行排除或升级。
4、排除依赖冲突可以使用exclusions标签,升级依赖库可以在pom文件中指定新版本号,但要注意兼容性。
5、在解决依赖冲突的过程中,可以将依赖库逐一排除,确定问题出在哪个依赖库,再采取相应的解决措施。
6、对于比较大型的项目,可以使用类似Dependency-Track等工具来监控依赖库的使用情况,及时发现和处理依赖冲突问题。