使用EasyExcel报错NoClassDefFoundError: org/apache/poi/util/TempFileCreationStrategy,并不Easy

Posted Peter-OK

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用EasyExcel报错NoClassDefFoundError: org/apache/poi/util/TempFileCreationStrategy,并不Easy相关的知识,希望对你有一定的参考价值。

最近项目中使用了alibaba的EasyExcel,结果报错抛出了Error,导致虽然 catch 了 Exception,然并卵。。。

首先来回顾一下JDK的API中对 Throwable、Exception和Error的解释:

Throwable 类是 Java 语言中所有错误或异常的超类,其子类有Exception和Error。既然Error和Exception都是继承自Throwable,所以从根本上你可以理解他们是差不多的,程序出了问题就抛出。然后一般意义来讲,区别就是Error比Exception更严重,不易通过后续代码处理和修复,不应该被代码catch到的错误。而Exception是指严重程度较轻的程序问题,相较于Error更容易被后续代码处理和修复的,有些需要通过try catch代码处理,有些不建议通过try catch代码处理。

此处要注意:Error是错误,正常的程序时不应该捕获的,因为这些错误消除后可能再也不会出现,所以我们几乎从来没有看到catch子句中捕获Error的情况,但是Error还是可以被捕获,对于那些说Error不能把捕获的说法,是错误的!

接着再来分析下使用EasyExcel的报错:

可以看到最先是底层的抛异常: ClassNotFoundException: org.apache.poi.util.TempFileCreationStrategy

(来自poi的jar包)

然后该异常被EasyExcel的代码捕获,进而抛出错误:NoClassDefFoundError: org/apache/poi/util/TempFileCreationStrategy

看到这儿有点尬,不太理解,为何你捕获的Exception,却要往上抛Error?毕竟EasyExcel来自高手云集的alibaba,本着严谨的态度,翻看下源码,

对照日志,暂时追踪到此处 com.alibaba.excel.write.ExcelBuilderImpl,调用构造方法实例化对象,因为有static静态代码块,所以第30行代码先执行,根据方法名推断大致功能是“创建poi文件目录”,继续深挖

可以发现在第138行,有 new DefaultTempFileCreationStrategy(poiFilesPathFile),进入该类

我们发现该类是 TempFileCreationStrategy接口的实现类,也就是——最先是底层的抛异常: ClassNotFoundException: org.apache.poi.util.TempFileCreationStrategy

等会儿再解释抛这个异常的原因,先继续探究 为何你捕获的Exception,却要往上抛Error?

为何呢?如果还没反应过来,可以再看一下抛出的是什么错误:java.lang.NoClassDefFoundError

“NoClassDefFoundError错误发生的原因:NoClassDefFoundError错误的发生,是因为Java虚拟机在编译时能找到合适的类,而在运行时不能找到合适的类导致的错误。例如在运行时我们想调用某个类的方法或者访问这个类的静态成员的时候,发现这个类不可用,此时Java虚拟机就会抛出NoClassDefFoundError错误。与ClassNotFoundException的不同在于,这个错误发生只在运行时需要加载对应的类不成功,而不是编译时发生。很多Java开发者很容易在这里把这两个错误搞混。”

原来是在ExcelBuilderImpl之前,执行静态代码块中的方法,而该静态方法没有处理异常,所以导致程序抛出的 ClassNotFoundException 被Java虚拟机接收到,进而抛出了 NoClassDefFoundError 。

自此,真相大白,alibaba的 jipengfei同学 和大多数开发小伙伴一样,使用了封装的工具类,在封装工具类的时候也没有预想到会出现ClassNotFoundException 。[微笑表情]

 

现在来解释抛这个异常的原因,ClassNotFoundException。明明有poi的jar包,为何会找不到这个类呢?

什么情况下会出现这种情况?一种情况是的确缺少这个类,还有一种情况就是jar包冲突,此处显然不是情况一,故整理maven依赖,删除各个module中重复的 dependency,exclusion冲突的gav。(注意:EasyExcel-2.2.6底层依赖的poi版本是3.17

再次 打包 发布,运行OK,不再抛异常,成功下载!

 

后记:如果EasyExcel的作者能看到,希望能修复下这个问题。同时,前段时间,在项目就尝试将几个下载功能,用easyexcel替换了easypoi,测试OK后上线,结果上线后发现其他未替换的一些上传和下载功能不正常了,幸亏发现及时,当晚紧急回退了版本,第二天排查原因发现是EasyExcel底层依赖的poi版本太低,和项目里依赖的版本不匹配,而poi版本之间的差异还挺大,最后不得不放弃了在项目里的使用。

现在这是一个新的项目,因为感觉EasyExcel对比其他工具类写起来的确挺Easy所以就想再用一下,结果又出现了故事,唉,EasyExcel用好真的不太Easy  (╯^╰)

alibaba的fastjson还是挺好用的,虽然不时爆出来有些漏洞,但使用起来还是挺顺滑的,点赞!

本文链接:https://blog.csdn.net/xingkongtianma01/article/details/111886653

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

 

 

 

以上是关于使用EasyExcel报错NoClassDefFoundError: org/apache/poi/util/TempFileCreationStrategy,并不Easy的主要内容,如果未能解决你的问题,请参考以下文章

使用EasyExcel报错NoClassDefFoundError: org/apache/poi/util/TempFileCreationStrategy,并不Easy

开发错误记录阿里easyexcel报错java.lang.NoClassDefFoundError: org/apache/commons/collections4/CollectionUtils

开发错误记录阿里easyexcel报错java.lang.NoClassDefFoundError: org/apache/commons/collections4/CollectionUtils

SpringBoot集成EasyExcel的使用

easyexcel中poi

EasyExcel报错 ExcelDataConvertException: Can not find ‘Converter‘ support class List