每次依赖的二方库Or三方库升级经常会遇到jar依赖冲突的问题,此问题经常会搞得大家晕头转向不停的猜测哪里出问题,下面梳理一下解决问题步骤。
以下案例为预警系统升级Napoli2.0 引起上传附件失败。
第一步定位问题:
2014-01-02 18:49:26,962 http-8080-5 [AbstractWebxRootController.java:189] ERROR : Error occurred while process request /quickview/upload/upload.htm
java.lang.NoSuchMethodError: org.apache.commons.io.output.DeferredFileOutputStream.<init>(ILjava/lang/String;Ljava/lang/String;Ljava/io/File;)V
at **********.upload.impl.cfu.AbstractFileItem.getOutputStream(AbstractFileItem.java:562)
分析上面日志会看到三个信息
AbstractWebxRootController 日志输出位置
DeferredFileOutputStream 出错类(因为此类在多个jar中出现导致jar冲突)
AbstractFileItem 异常跑出类
第二步 配置环境获取 DeferredFileOutputStream 具体使用jar 的路径
AbstractFileItem.java:562 打断点
找出Expressions视图(Window->show view ->Expressions)
添加表达式:DeferredFileOutputStream.class.getProtectionDomain().getCodeSource().getLocation();
第三部 进行debug 如最后图所示
第四步:排除冲突
经过上面三步 定位到使用的jar 后排除掉
方法一:使用eclipse 中pom依赖关系查看定位
方法二:使用cmd命令排除,mvn dependency:tree >tree.txt
最后改pom 代码,这里就不列出来了
实际错误为 commons.is-1.3.1.jar 上图为去掉冲突之后的实际位置