java.lang.NoSuchFieldError: FAIL_ON_SYMBOL_HASH_OVERFLOW 解决方法

时间:2024-01-23 17:29:16

本文旨在帮助所有遇到maven引包冲突的人彻底解决问题,并介绍解决冲突的步骤。对于新手来说,解决引包冲突相当麻烦且非常耗时,这篇文章旨在帮助梳理分析和解决步骤,帮助其他人尽快解决冲突问题。

IDE:IntelliJ Idea maven

本人遇到的问题:为当前Spring项目添加elasticsearch时,单元测试一切OK。但是由于es在创建client和释放链接都各自要耗时2000ms左右,所以要确保初始化一次之后复用该client,但在启动之后创建bean的时候报出了java.lang.NoSuchFieldError: FAIL_ON_SYMBOL_HASH_OVERFLOW的异常。

通过报错信息(不粘了,都一样的)可以追踪到倒数第二步:

可以看到,该静态代码块调用了SmileFactory.Feature.FAIL_ON_SYMBOL_HASH_OVERFLOW,而报错信息说没有该字段。至此,原因就很明显了,实际用到的包里没有该字段,那一定是包引用的有冲突。那么,能不能点进去呢?

点进去了、、、

很奇怪,看源码里的注释:是2.4版本后增加的此枚举值,需要说明一下,这个类是

<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>

里面的JsonFactory。那么,第一反应就是,jackson-core这个包冲突了呗,我用的es版本引用的jackson版本号是2.8.6,而注释里说了2.4版本之后增加的,那一定是实际用到的包不是咱们的2.8.6,而是2.4之前的版本。

那么开始第一步,检查冲突。工具:Idea插件Maven Helper

直接去官网下载zip到本地,然后再idea里ctrl+alt+s打开设置,进到plugins标签下,点击install plugin from disk...,重启idea即可

成功后的验证:打开你的pom文件会看到下面多出个Dependency Analyzer标签。

 点开该标签是这样的界面,非常直观,它会列出你所有的冲突(该截图已经是把所有冲突解决完了的状态)。直接在搜索框里搜索项目就可以,范围分别是冲突列表,list形式的所有依赖,tree形式的所有依赖。解决冲突的办法就是在冲突的版本之中选择你要排除的某个引用,右键点击Exclude即可,然后reimport maven,刷新查看处理剩余冲突。

 

第一步至此结束,一般情况下,依赖冲突都可以解决掉了。本步骤的替代方法就是在maven窗口中(可以通过设置alt+8快捷键打开关闭maven窗口,操作步骤为ctrl+alt+s打开设置,进入keymap标签,找到Tool Window目录下,给Maven Project设置快捷键):

 

 接着打开Maven Project窗口,点击下图图标

键入dependency:tree -Dverbose,执行

然后会进入漫长的下载pom,下载jar步骤,最后会输出依赖树,可以看到里面的包哪些被使用,哪些被遮盖(ommited忽略)

 

如果还是不行,则进行第二步,查看运行中使用的类的jar包。

此处是看到了此人的博客http://stamen.iteye.com/blog/2030552,内有查看jar的工具类,复制到你的项目中用一下就行。

笔者就是通过这种方法最终找到了问题所在,原因是WEB-INF/lib/下有唯一一个老旧的包,jackson-core-2.3.2.jar,它把同目录下的2.8.6的包顶了,以至于先把它的class给load进来,所以你再检查代码到时候是看不到它的,因为这时你用的包是maven仓库下的。

 

最后,删除掉该jar世界立刻太平了。

再梳理下遇到此类问题的分析步骤:

遇到找不到类、方法、字段要么是少包,要么是冲突。少则引,冲突则查看依赖树,如何查看需要你对IDE工具熟悉和对Maven有初步的了解(足以),看生成依赖树比较麻烦,项目一大的话生成的树字又小,并且点一下屏幕就跑。所以用Maven Helper插件直接帮你查出冲突并解决最方便,dependency:tree命令也显得繁琐了,但是能帮助你更好地理解Maven。如果依赖都解决完了还是出问题,就得找别地方的问题,靠经验了,这里学到一条并分享出来:用RTTI找jar包,看是不是lib包里没清干净。

结语:找这个问题花了半天的时间,网上都是复制粘贴的博客,对解决问题没有一丝帮助,所以为了不让别人遭受同样的痛苦,特此把解决步骤赶快写下来分享,写得比较仓促,哪里没说明白请指出,我会修改。谢绝转载