jar包冲突了?如何肯定是和哪一个jar包冲突了?

导读:工程编译的时候好好地,怎么一运行就报各类的NoSuch***Error,猜想多是jar包冲突了,可是到底是和哪一个jar包冲突了呢。java

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

问题背景maven

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

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

 

,idea检查是没有任何问题的,可是跑单元测试的时候居然报NoSuchFiledError(找不到Feature.OrderField),我猜想多是jar包冲突了,因此下一步就是找出究竟是和哪一个jar包冲突了。工具

解决方法一单元测试

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

解决方法二url

我仔细分析了报错的堆栈信息,报错只是说Field找不到,可是Field所属的Class是能够找到的,那有没有一种办法能够经过Class找到所属的jar包呢?最终经过度娘找到了一种办法,贴出来供你们使用idea

 
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);
}
  

  

水落石出spa

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

 

 

总结

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

十一假期最后一天,祝你们返程愉快,若是以为对你有用,请点一下推荐。

相关文章
相关标签/搜索