赞
踩
1、如果你使用了poi?
2、如果你报错信息是NoSuchMethodError
,ClassNotFoundException
?
3、以前没问题的功能现在复调突然有问题了?
如果上面的问题你都出现了,那差不多就是easyexcel 3.9版本和poi3.17版本冲突了,如下逐步解决!!
依赖冲突的原因总结一句话就是,依赖的版本和实际使用的版本不一致。
开发maven项目时我们常常遇到excel等文件的上传下载,这时候避免不了使用poi相关的几个依赖:
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>版本</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>版本</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>版本</version>
</dependency>
注意:
poi 、poi-ooxml 、 poi-ooxml-schemas这三个版本号要一致!!!
(排查三个版本号)
依赖冲突常见的表现有NoSuchMethodError
,ClassNotFoundException
等。
在出现报错信息之后,我们可以通过出错信息快速定位到有问题的jar包,如下一看猜测是poi相关的包有问题:
注意:【由于
maven依赖的传递性
,所以可能你原本好使的代码,不小心你或别人引入了一个新的看似无关的依赖,就可能把重复的依赖带进来】(排查最近新增加的依赖)
跟踪发现,我的项目里用的本部门公用的依赖,引用这里面的工具类ExcelExportUtil操作的excel(依赖传递过来,里面的POI jar包是3.9),当我引入新的依赖easyExcel时,原本的导出不可用了!因为easyExcel支持最低的POI版本是3.17,maven会自动使用最高级的版本,所以原本使用的工具类ExcelExportUtil找不到了,poi.jar包版本冲突导致的!
如下两个包冲突:
<!-- 部门统一common包 -->
<dependency>
<groupId>com.test.b2c.base</groupId>
<artifactId>test-b2c-base-common</artifactId>
<version>${test-b2c-base-common}</version>
</dependency>
<!-- 新引入 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.2.7</version>
</dependency>
1)由于原本功能使用低版本jar的工具类ExcelExportUtil操作的相关代码已上线,
所以把低版本相关代码替换成easyexcel的方案pass掉,风险高,尽量少变动;
如果没上线,条件允许,建议改掉原来代码,统一升级为poi高版本;
eg:
<dependency>
<groupId>com.test.b2c.base</groupId>
<artifactId>test-b2c-base-common</artifactId>
<version>${test-b2c-base-common}</version>
<exclusions>
<exclusion>
<artifactId>poi-ooxml</artifactId>
<groupId>org.apache.poi</groupId>
</exclusion>
<exclusion>
<artifactId>poi-ooxml-schemas</artifactId>
<groupId>org.apache.poi</groupId>
</exclusion>
<exclusion>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
</exclusion>
</exclusions>
</dependency>
2)都用传递进来的低版本的jar操作,避免使用新引入的easyexcel,那样最近写的相关代码都要整改掉,如果少可以,偏偏我时间很紧张,没时间整改,而且使用easyexcel更方便,可以保证大数据量导出不会OOM。
3)不想改旧的代码,又没时间调整新的,怎么办?只能做升级兼容处理了,两者并存!
首先我不用传递依赖过来的工具类了,直接找到该工具类源码,在我本项目中创建一模一样的类,然后把原来调用的地方包路径从依赖包改为本项目包路径:
原来的:com.test.b2c.base.common.util.excel.ExcelExportUtil;
新的:com.test.newproject.common.util.excel.ExcelExportUtil;
注意:转换过程中
CellStyle.ALIGN_CENTER
提示找不到,替换成HorizontalAlignment.CENTER;
cell.setCellType(XSSFCell.CELL_TYPE_STRING);
过期替换cell.setCellType(CellType.STRING);
由于版本差异问题,需转换。
<!-- 部门统一common包 -->
<dependency>
<groupId>com.test.b2c.base</groupId>
<artifactId>test-b2c-base-common</artifactId>
<version>${test-b2c-base-common}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.2.7</version>
<exclusions>
<exclusion>
<artifactId>poi-ooxml-schemas</artifactId>
<groupId>com.test.b2c.base</groupId>
</exclusion>
<exclusion>
<artifactId>poi-ooxml</artifactId>
<groupId>com.test.b2c.base</groupId>
</exclusion>
<exclusion>
<artifactId>poi</artifactId>
<groupId>com.test.b2c.base</groupId>
</exclusion>
</exclusions>
</dependency>
这样3.9版本的包和调用都不存在了
在上一步骤的基础上增加内容:
<poi.version>4.1.2</poi.version>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>${poi.version}</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>${poi.version}</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>${poi.version}</version>
</dependency>
注:(
4.0以上版本都可以
),现在项目中就是4.0以上的高版本了。
easyexcel 3.9版本和poi3.17版本冲突怎么办?
根据自己项目情况选择处理
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。