背景
关于maven这个自动构建工具,大多数程序员已经用了很久了,最近在编码过程中需要引入其他jar包时不止一次遇到过jar包冲突所带来的问题。所以在此记录一下排查方法。
排查过程
首先根据报错查看源码,你需要断定出来是不是jar包冲突,这个时候比较明显的一些报错是比如明明源码中有这个方法,但是提示确找不到、或者干脆找不到这个类,还有你发现抛出的异常和源码中对应的行数所对应的内容也不一样等等。那么当你通过任何途径大概心理有个底了,就可以上才艺了,方法很多,能够解决问题就是好方法。
常见但不仅限于以下异常: NoSuchMethodException ClassNotFoundException NoClassDefFoundError
举个栗子
在我这个工程中,我引用了org.apache.poi,但是我又想使用com.alibaba的easyexcel。看一下pom文件
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.10.1</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.2.6</version>
</dependency>
此时我再启动工程的时候,果不其然出错了。 看到这里,已经报出了我上面列出的三个异常其中之一。再想想自己引用的jar包,此时心理应该有点*数了对吧。下面就直奔主题开始排查
1.idea自带功能
打开maven菜单,点击show dependencies。 当然,这里和在pom文件中右击选择maven->show dependencies是一样的 都会展示jar包的依赖关系。如下图,红色的线就表示冲突了。 这时可以选中冲突的包然后右键exclude。就可以排除冲突。
2.idea插件
首先我使用的idea工具,可以安装插件maven helper。 这玩意装好,我们关闭窗口,有可能会叫你restart一下,你就乖乖听话。之后我们打开pom文件并且点击依赖分析。 这时就会进入到下面这个页面,可以看到左侧列表中已经列出了一些依赖,此时你可以点击Refresh UI用来刷新。 我们拿到最新的检测结果后可以点击左边的依赖,右边框体内会展示出来冲突的情况。 举个栗子,我们选中poi,再看右边框体,显示了poi引入版本是3.10.1,通过编译可以发现easyexcel2.2.6中存在冲突。 这时我们可以对冲突内容点击鼠标右键选择跳转到源码jump to source 这时它跳转到了easyexcel的pom文件中,我们很清晰的查看到了其中依赖的版本 到这里是不是已经找到了根本问题。那么如何解决呢。我们回到插件的分析页面。还是对着冲突点击右键选择Exclude。 此时重新刷新maven,再次进入依赖分析页面,点击Refresh UI。可以看到刚才分析出来的冲突少了一个。 此时我们回到pom编辑页面,可以看到easyexcel依赖中使用了exclusions标签排除了poi依赖,所以冲突解决了。
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.2.6</version>
<exclusions>
<exclusion>
<artifactId>poi</artifactId>
<groupId>org.apache.poi</groupId>
</exclusion>
</exclusions>
</dependency>
到这里,使用插件解决冲突的方法就已经完事了。
3.maven命令
命令行是我最喜欢的操作方式,可以使用mvn dependency:tree -Dverbose命令,以树形结构展现项目中的依赖。 类似这种情况,当你查看到冲突后,可以在pom中手动排除依赖即可。这里我使用命令去排查的时候并没有展示出来冲突,一般冲突可以在树型结构中搜索’conflict’找到,但是这个栗子并没有,所有有时候我们就多种方法结合,只要能解决问题即可!
项目地址:https://gitee.com/ErGouGeSiBaKe/jar-conflicts
|