查看原文
其他

jar包又冲突了?如何快速确定与哪个jar包冲突?

回复 1024 有特别礼包


来源 | urlify.cn/um6JV3

图源:pexels


上一篇:卸载Notepad++!事实已证明,它更牛逼……


前段时间写代码的时候想借助一下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包呢?最终通过度娘找到了一种办法,贴出来供大家使用

搜索顶级架构师公众号回复“架构整洁”,送你一份惊喜礼包。

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

水落石出

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

总结

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


大家一起在评论区聊聊呗~


公众号后台回复 架构 或者 架构整洁 有惊喜礼包!顶级架构师交流群

 「顶级架构师」建立了读者架构师交流群,大家可以添加小编微信进行加群。欢迎有想法、乐于分享的架构师们一起交流学习。

扫描添加好友邀你进架构师群,加我时注明姓名+公司+职位】


版权申明:内容来源网络,版权归原作者所有。如有侵权烦请告知,我们会立即删除并表示歉意。谢谢。

猜你还想看

如何使用SpringBoot AOP 记录操作日志、异常日志?
Spring Boot 打包不同环境配置与 Shell 脚本部署
讨论:Service层需要接口吗?
关于Redis缓存,这3个问题一定要知道!

: . Video Mini Program Like ,轻点两下取消赞 Wow ,轻点两下取消在看

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存