打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
jar包冲突了?如何确定是和哪个jar包冲突了?

关键词:jar包冲突,NoSuchFileldError,NoSuchMethodError

问题背景

前段时间写代码的时候想借助一下fastjson的Feature.OrderedField来解决json乱序的问题,只需要增加一个参数即可,像下面这样

JSON.parseObject('...', Feature.OrderedField)

,idea检查是没有任何问题的,但是跑单元测试的时候竟然报NoSuchFiledError(找不到Feature.OrderField),我猜测可能是jar包冲突了,所以下一步就是找出到底是和哪个jar包冲突了。

解决方法一

最开始我以为是maven传递依赖了老版本的fastjson包,所有我尝试使用“mvn dependency:tree”来输出项目中的所有jar包依赖一看究竟,结果让人大跌眼镜,整个项目只依赖了1.2.58版本的fastjson包,传递依赖的猜测随之破灭。

解决方法二

我仔细分析了报错的堆栈信息,报错只是说Field找不到,但是Field所属的Class是可以找到的,那有没有一种办法可以通过Class找到所属的jar包呢?最终通过度娘找到了一种办法,贴出来供大家使用Feature.class.getProtectionDomain().getCodeSource().getLocation().getFile()

try{  JSON.parseObject('...', Feature.OrderedField)}catch(Throwable e){    String loc = '';     String urlLoc = '';     try {           loc =Feature.class.getProtectionDomain().getCodeSource().getLocation().getFile();      urlLoc =  URLDecoder.decode(loc, 'UTF-8');   } catch (Throwable e2) {        }        logger.info('** loc=' + LOCATION + '; URLLoc=' + URLLOCATION);}

水落石出

最终找到了导致冲突的jar原来是公司自研的消息队列提供的producer client,在这个jar包内部将fastjson的源码直接打到了jar包里面,所以在不同的jar包内竟然出现了包名和类名都一样的class,下面这个图是producer client jar包内部的目录结构,这种使用第三方工具包的方式我也是第一次见,感觉挺坑的(耦合太严重),最终我没有使用fastjson来解决我的问题(推动平台组需要时间),而是借助了Gson将这个问题绕过去了。

总结

主要介绍了两种找出冲突jar包的方式,第一种是使用“mvn dependency:tree”的方式,但是这种方式存在局限性,就像前面说到的那种,两个看似不相干的jar包内竟然出现了包名和类名都一样的class,第二种是直接通过class对象获取jar包全路径的方式,这种方式更通用,但是需要改动一点代码。

踩刀诗人 发起了一个读者讨论 来都来了,说点什么吧

EOF

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
JSON解析教程(Gson、FastJson、Jackson)
【140324-01】jar包版本冲突
SpringMVC返回json数据的三种方式
使用FastJSON,将对象或数组和JSON串互转
用Maven快速生成带有依赖的可执行jar包
JavaMail jar包冲突
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服