zoukankan      html  css  js  c++  java
  • java.lang.NoSuchFieldError: FAIL_ON_SYMBOL_HASH_OVERFLOW 解决方法

    本文旨在帮助所有遇到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包里没清干净。

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

  • 相关阅读:
    null in ABAP and nullpointer in Java
    SAP ABAP SM50事务码和Hybris Commerce的线程管理器
    Hybris service layer和SAP CRM WebClient UI架构的横向比较
    SAP ABAP和Linux系统里如何检查网络传输的数据量
    SAP CRM WebClient UI和Hybris的controller是如何被调用的
    SAP CRM和Cloud for Customer订单中的业务伙伴的自动决定机制
    SAP CRM WebClient UI和Hybris CommerceUI tag的渲染逻辑
    SAP BSP和JSP页面里UI元素的ID生成逻辑
    微信jsapi支付
    微信jsapi退款操作
  • 原文地址:https://www.cnblogs.com/cachedking/p/8081467.html
Copyright © 2011-2022 走看看