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

文章目录

  • 背景:
    • 1、poi相关的几个依赖
    • 2、定位依赖冲突
    • 3、解决冲突
      • 第一步:去除低版本调用路径
      • 第二步:排除低版本依赖
      • 第三步:升级版本做兼容
    • 4、总结

背景:

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

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

1、poi相关的几个依赖

开发maven项目时我们常常遇到excel等文件的上传下载,这时候避免不了使用poi相关的几个依赖

  <dependency>
            <groupId>org.apache.poigroupId>
            <artifactId>poiartifactId>
            <version>版本version>
        dependency>
        <dependency>
            <groupId>org.apache.poigroupId>
            <artifactId>poi-ooxmlartifactId>
            <version>版本version>
        dependency>
        <dependency>
            <groupId>org.apache.poigroupId>
            <artifactId>poi-ooxml-schemasartifactId>
            <version>版本version>
        dependency>

注意:poi 、poi-ooxml 、 poi-ooxml-schemas这三个版本号要一致!!!(排查三个版本号)

2、定位依赖冲突

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

在出现报错信息之后,我们可以通过出错信息快速定位到有问题的jar包,如下一看猜测是poi相关的包有问题:
easyexcel 3.9版本和poi3.17版本冲突解决办法_第1张图片

注意:【由于maven依赖的传递性,所以可能你原本好使的代码,不小心你或别人引入了一个新的看似无关的依赖,就可能把重复的依赖带进来】(排查最近新增加的依赖)

跟踪发现,我的项目里用的本部门公用的依赖,引用这里面的工具类ExcelExportUtil操作的excel(依赖传递过来,里面的POI jar包是3.9),当我引入新的依赖easyExcel时,原本的导出不可用了!因为easyExcel支持最低的POI版本是3.17,maven会自动使用最高级的版本,所以原本使用的工具类ExcelExportUtil找不到了,poi.jar包版本冲突导致的!
如下两个包冲突:

 
        <dependency>
            <groupId>com.test.b2c.basegroupId>
            <artifactId>test-b2c-base-commonartifactId>
            <version>${test-b2c-base-common}version>
  dependency>
  
   
  <dependency>
            <groupId>com.alibabagroupId>
            <artifactId>easyexcelartifactId>
            <version>2.2.7version>
  dependency>

3、解决冲突

1)由于原本功能使用低版本jar的工具类ExcelExportUtil操作的相关代码已上线,
所以把低版本相关代码替换成easyexcel的方案pass掉,风险高,尽量少变动;
如果没上线,条件允许,建议改掉原来代码,统一升级为poi高版本;
eg:

  <dependency>
            <groupId>com.test.b2c.basegroupId>
            <artifactId>test-b2c-base-commonartifactId>
            <version>${test-b2c-base-common}version>
 			<exclusions>
 			     <exclusion>
                    <artifactId>poi-ooxmlartifactId>
                    <groupId>org.apache.poigroupId>
                exclusion>
 				 <exclusion>
                    <artifactId>poi-ooxml-schemasartifactId>
                    <groupId>org.apache.poigroupId>
                exclusion>
                <exclusion>
                    <groupId>org.apache.poigroupId>
                    <artifactId>poiartifactId>
                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);
由于版本差异问题,需转换。

第二步:排除低版本依赖

 
        <dependency>
            <groupId>com.test.b2c.basegroupId>
            <artifactId>test-b2c-base-commonartifactId>
            <version>${test-b2c-base-common}version>
  dependency>
 <dependency>
            <groupId>com.alibabagroupId>
            <artifactId>easyexcelartifactId>
            <version>2.2.7version>
            <exclusions>
                <exclusion>
                    <artifactId>poi-ooxml-schemasartifactId>
                    <groupId>com.test.b2c.basegroupId>
                exclusion>
                <exclusion>
                    <artifactId>poi-ooxmlartifactId>
                    <groupId>com.test.b2c.basegroupId>
                exclusion>
                <exclusion>
                    <artifactId>poiartifactId>
                    <groupId>com.test.b2c.basegroupId>
                exclusion>
            exclusions>
        dependency>

这样3.9版本的包和调用都不存在了

第三步:升级版本做兼容

在上一步骤的基础上增加内容:

<poi.version>4.1.2poi.version>
<dependency>
   <groupId>org.apache.poigroupId>
   <artifactId>poiartifactId>
   <version>${poi.version}version>
dependency>
<dependency>
   <groupId>org.apache.poigroupId>
   <artifactId>poi-ooxmlartifactId>
   <version>${poi.version}version>
dependency>
<dependency>
   <groupId>org.apache.poigroupId>
   <artifactId>poi-ooxml-schemasartifactId>
   <version>${poi.version}version>
dependency>

注:(4.0以上版本都可以),现在项目中就是4.0以上的高版本了。

4、总结

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

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

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

你可能感兴趣的:(《git,maven工具日常》系列,java,maven,poi,easyexcel)