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

点击上方蓝色字体,选择“设为星标”

回复”666“获取面试宝典

b8844eaceb76c4d6cd0afa0873c1d0e2.png

前段时间写代码的时候想借助一下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 =
        
      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,下面这个图是jar包内部的目录结构,这种使用第三方工具包的方式我也是第一次见,感觉挺坑的(耦合太严重),最终我没有使用fastjson来解决我的问题,而是借助了Gson将这个问题绕过去了。

ef30fc57d86df2db76dce6817801eaf5.png

总结

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

来源 | https://urlify.cn/um6JV3 9d8145a1b9888403a171f0e7db49de69.gif
  • 面试官问:MySQL的自增ID用完了,怎么办?

  • ArrayList插入1000w条数据之后,我怀疑了jvm...

  • 蚂蚁二面,面试官问我零拷贝的实现原理,当场懵了…

25c68a3e8a8b83600af77b500e8e3ff7.png

最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

明天见(。・ω・。)ノ♡
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值