easyexcel 3.9版本和poi3.17版本冲突解决办法

背景:

1、如果你使用了poi?
2、如果你报错信息是NoSuchMethodErrorClassNotFoundException
3、以前没问题的功能现在复调突然有问题了?
如果上面的问题你都出现了,那差不多就是easyexcel 3.9版本和poi3.17版本冲突了,如下逐步解决!!

依赖冲突的原因总结一句话就是,依赖的版本和实际使用的版本不一致。

1、poi相关的几个依赖

开发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这三个版本号要一致!!!(排查三个版本号)

2、定位依赖冲突

依赖冲突常见的表现NoSuchMethodErrorClassNotFoundException 等。

在出现报错信息之后,我们可以通过出错信息快速定位到有问题的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>

3、解决冲突

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以上的高版本了。

4、总结

easyexcel 3.9版本和poi3.17版本冲突怎么办?

  • 排查poi几个依赖版本一致问题;
  • 排查最新添加的依赖;
  • 旧的代码全部更换为easyexcel(改吧);
  • 去掉easyexcel写的新代码全部改为旧的方式(重新开发吧);
  • 兼容两者,改动量较少(就是项目中出现两套,不是很规范,但是能临时解决问题);

根据自己项目情况选择处理

  • 5
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只IT攻城狮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值