Spark-excel与Java PoI的ZipArchiveInputStream类冲突报错如何解决?
根因说明
该异常是org.apache.commons:commons-compress包版本不兼容导致:Apache POI 4.0及以上版本要求commons-compress版本≥1.17,只有该版本及以上的ZipArchiveInputStream类才实现了InputStreamStatistics接口。Spark集群默认自带的commons-compress版本通常低于1.17,类加载时优先加载了集群的低版本包,就会触发该报错。
问题定位步骤
- 第一步:确认项目中引入的POI版本、spark-excel版本对应的官方commons-compress依赖要求
- 第二步:打印依赖树排查冲突:Maven项目执行
mvn dependency:tree | grep commons-compress,SBT项目执行sbt dependencyTree | grep commons-compress,查看所有传递引入的commons-compress版本,确认是否存在低版本包 - 第三步:验证集群依赖优先级:可在Spark代码中打印
ZipArchiveInputStream的类加载路径,确认是否加载的是集群自带的低版本包
解决方案
方案1:调整Spark提交参数(无需修改代码和打包配置,优先级最高)
提交任务时添加配置,强制优先加载项目自带的高版本commons-compress:
--conf spark.driver.userClassPathFirst=true --conf spark.executor.userClassPathFirst=true
部分YARN集群出于安全限制会禁止userClassPathFirst参数,该场景下可使用如下配置:
--jars ./commons-compress-1.21.jar --conf spark.driver.extraClassPath=./commons-compress-1.21.jar --conf spark.executor.extraClassPath=./commons-compress-1.21.jar
上述配置中的commons-compress-1.21.jar可替换为符合POI版本要求的任意高版本包。
方案2:修改项目依赖配置,统一依赖版本
Maven配置示例
在pom.xml的dependencyManagement节点强制锁定commons-compress版本:
<dependencyManagement> <dependencies> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-compress</artifactId> <version>1.21</version> </dependency> </dependencies> </dependencyManagement>
同时排除spark-excel等组件传递引入的低版本commons-compress:
<dependency> <groupId>com.crealytics</groupId> <artifactId>spark-excel_2.12</artifactId> <version>3.3.1_0.18.5</version> <exclusions> <exclusion> <groupId>org.apache.commons</groupId> <artifactId>commons-compress</artifactId> </exclusion> </exclusions> </dependency>
SBT配置示例
在build.sbt中强制指定版本:
dependencyOverrides += "org.apache.commons" % "commons-compress" % "1.21"
排除传递依赖:
libraryDependencies += "com.crealytics" %% "spark-excel" % "3.3.1_0.18.5" exclude("org.apache.commons", "commons-compress")
方案3:Shaded打包(终极解决办法,彻底隔离冲突)
如果集群环境限制导致前两种方案失效,可通过shade插件把commons-compress打包到项目jar中,并重命名包名彻底和集群依赖隔离。Maven shade插件配置示例如下:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.2.4</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <relocations> <relocation> <pattern>org.apache.commons.compress</pattern> <shadedPattern>shaded.org.apache.commons.compress</shadedPattern> </relocation> </relocations> </configuration> </execution> </executions> </plugin>
内容的提问来源于stack exchange,提问作者Wind
相关产品推荐
相关产品推荐

