You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 00:54:01