最近同事给我推荐了一个开源的excel解析工具EasyPOI ,maven 如下:
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-spring-boot-starter</artifactId>
<version>4.2.0</version>
</dependency>
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-base</artifactId>
<version>4.2.0</version>
</dependency>
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-web</artifactId>
<version>4.2.0</version>
</dependency>
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-annotation</artifactId>
<version>4.2.0</version>
</dependency>
在引用的过程中与项目中的几处jar存在了jar包冲突,让我有机会可以总结一下排查jar包冲突的方法。
首先推荐一个idea 中的maven的插件 maven Helper 。用来查看项目项目中的jar包冲突。 下面的排查过程都会用到。在idea->file->settings->plugins 中 下载。下载成功之后需要重启。
1、第一个冲突:运行程序报错。java.lang.NoSuchMethodError: org.apache.poi.ss.usermodel.Cell.getCellType()Lorg/apache/poi/ss/usermodel/CellType;
从报错中可以看出是Cell类中的一个方法没有找到,这种error一般都是因为jar包冲突引起的,因为引入了不同版本的jar包,而多个版本中 Cell类的实现方式不一样。导致的错误。
接下来使用ctrl+n 来查看Cell这个类是哪个jar包下的。
通过查询,我发现Cell这个类是Apache的POI这个jar包中的,并且当前的版本是3.17,接来下我来看看 我的项目需要哪些版本的POI.通过mavenHelper 来查看。
在项目的pom文件下面会找到这个页面。点进去就可以查到项目中所有依赖的jar包和他们的版本。
在这里冲突conflicts这里,我发现poi的jar包确实冲突了。
我的项目中依赖的poi是3.17版本的和在上图中看到的是一样的,我easypoi需要的poi是4.1.1版本的,所以我只能将poi升级。在pom文件中显示的引入poi4.1.1
在项目中引入下面的依赖之后点reimport:
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.1</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.1</version>
</dependency>
还是存在冲突,这时我有两种选择,<exclude>两个jar包中的POI ,或者在父工程当中<dependencyManagement> 一下项目中poi 的版本,我选择后者。
在父pom文件中加入下面的依赖,点一下reimport,发现项目中的poi版本都固定成了4.1.1,并且在冲突conflicts中找不到poi的冲突了。
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.1</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.1</version>
</dependency>
</dependencies>
</dependencyManagement>
我重新运行一下测试用例:
2、编译错误:HSSFCell.CELL_TYPE_STRING 这个常亮在jar包升级中被删除了,我只能换一种新的写法CellType.STRING,替换之后再运行。