com.alibaba.excel.exception.ExcelAnalysisException: java.lang.NoClassDefFoundError: org/apache/poi/poifs/filesystem/FileMagic
at com.alibaba.excel.analysis.ExcelAnalyserImpl.<init>(ExcelAnalyserImpl.java:57) ~[easyexcel-2.2.11.jar:na]
at com.alibaba.excel.ExcelReader.<init>(ExcelReader.java:145) ~[easyexcel-2.2.11.jar:na]
at com.alibaba.excel.read.builder.ExcelReaderBuilder.build(ExcelReaderBuilder.java:193) ~[easyexcel-2.2.11.jar:na]
at com.alibaba.excel.read.builder.ExcelReaderBuilder.sheet(ExcelReaderBuilder.java:229) ~[easyexcel-2.2.11.jar:na]
at com.alibaba.excel.read.builder.ExcelReaderBuilder.sheet(ExcelReaderBuilder.java:217) ~[easyexcel-2.2.11.jar:na]
//......
在使用 easyexcel 解析表格的时候,出现了这个问题。
定位发现原来是 easyexcel 依赖的 poi 依赖包出了问题。目前项目中导入的版本是 3.15 的,这个版本下的依赖是没有 FileMagic 这个class文件的,所以会出现上述错误。
网上查阅了相关资料,大家都是建议升级至 3.17 的版本。
于是我手动在引入 easyexcel 的 pom中升级了版本。可是神奇的事情还是发生了,刷新maven之后,拉进来的poi依赖版本还是3.15。
因为目前整个项目是由4个子项目构成的,可能是子项目读取某个依赖里的 poi 的3.15版本。
解决办法
通过在父项目中的 dependencyManagement 标签中显示的声明 poi 的版本,问题得以解决
dependencyManagement 和 dependencies 区别
dependencies
在多模块工程中,会有一个 父pom 和 多个 子pom 的情况存在。这时候如果在 pom中的 dependencies 定义了某个依赖,那么所有 子pom 都会自动继承这个依赖
子模块中的 pom 可以什么都不做,就会默认从父 pom 中继承所有的依赖。另外子模块也可以使用不同版本的依赖进行覆盖。
dependencyManagement
上面的依赖继承中,父 pom 中定义的依赖,可以直接被子 pom 继承,子 pom 中不用再次声明。这听起来不错,但是仔细想想还是有一些不好的地方:
- 父pom 定义的依赖,会被所有子模块继承,即使有的模块可能根本不需要这个依赖,这会导致打包后的jar臃肿,甚至有冲突的问题存在。
- 子模块的 pom 中可以覆盖继承的依赖,这可能导致依赖版本管理出现混乱。
而使用 dependencyManagement 的话,便可以很好的解决上面两个问题:
- dependencyManagement 中声明的依赖,仅仅是声明,并没有真正的引入依赖。这样子模块可以从声明的依赖中,选择自己需要的,而不会继承所有父 pom 中的依赖。
- dependencyManagement 中除了声明依赖,还指定了依赖的版本。这样在子模块的依赖中,就无须指定版本,而是使用 dependencyManagement 指定的版本。