easyExcel读取大文件NoClassDefFoundError或者NoSuchMethodException等问题
jar包问题
在读取超级大文件(200MB的excel算大了吧)的时候出现各种的NoClassDefFoundError或者NoSuchMethodException等异常,而且异常信息都是有关Ehcache的
首先看easyExcel官方介绍
由介绍可以知道,在excel文件小于5M的时候,默认使用内存,大于5M会使用EhCache缓存来处理。
那么就知道,上面报的错是因为文件太大,使用EhCache出现的问题
指定excel使用的缓存
指定只使用默认(只用内存)
public static void main(String[] args) {
String fileName = "E:/test.xlsx";
ExcelReader excelReader = null;
try {
excelReader = EasyExcel.read(fileName, new ImportExcel())
.readCache(new MapCache())// 这里指定MapCache就是默认的全部用内存,不使用EhCache,但是这就要求内存要大
.build();
ReadSheet readSheet = EasyExcel.readSheet(0).build();
excelReader.read(readSheet);
} finally {
if (excelReader != null) {
// 这里千万别忘记关闭,读的时候会创建临时文件,到时磁盘会崩的
excelReader.finish();
}
}
}
指定Ehcache
可以参考:https://blog.csdn.net/weixin_42528266/article/details/109237951
public static void main(String[] args) {
String fileName = "E:/test.xlsx";
ExcelReader excelReader = null;
try {
excelReader = EasyExcel.read(fileName, new ImportExcel())
.readCacheSelector(new SimpleReadCacheSelector(20, 90))// 这里就是使用内存+磁盘,会用到EhCache
.build();
ReadSheet readSheet = EasyExcel.readSheet(0).build();
excelReader.read(readSheet);
} finally {
if (excelReader != null) {
// 这里千万别忘记关闭,读的时候会创建临时文件,到时磁盘会崩的
excelReader.finish();
}
}
}
在默认或者指定EhCache时,出现了异常!!
由easyExcel的pom文件可知,easyExcel使用的EhCache是3.4.0版本
为了看为啥EhCache报错,首先查看了项目打完包后的lib文件夹下,是不是有EhCache这个jar包
这个时候,如果你的项目的parent是springboot,那么你会发现,项目lib中,EhCachejar包的版本不是3.4.0,而是3.2.3。
因为springboot的版本管理中已经定义了EhCache的版本,这样打包的时候就会使用springboot中定义的版本
这个原因导致了项目打完包后,easyExcel的EhCache版本被污染,导致报错
因为mven的继承和<dependencyManagement>
版本管理,我们在自己的项目中没有定义EhCache版本,但又用到了EhCache,所以springboot的spring-boot-dependencies
就会把版本帮我们继承过来。
解决方法
我们需要在我们项目顶层pom中,手动定义一下Ehcache的版本号为easyExcel中EhCache的版本号
这样我们再把项目打包,去查看lib文件夹,会发现,EhCache的版本就是3.4.0,在读取超级大的Excel的时候,不管指不指定readCache,都不会报错了
本文地址:https://blog.csdn.net/qq_39030696/article/details/112273418
上一篇: 工厂模式之抽象工厂