升级Spring Boot Starter Parent至3.2/3.3后遇UnsupportedFileSystemException问题排查
Spring Boot升级后Hadoop DistCP的UnsupportedFileSystemException问题解决
问题根源
Spring Boot 3.2/3.3版本升级后,其依赖管理机制将commons-compress默认升级至1.22+版本,而Hadoop 3.3.6仅兼容1.21及以下版本的commons-compress。版本冲突导致Hadoop的nested文件系统抽象实现类无法被正确加载,触发UnsupportedFileSystemException。同时,Spring Boot 3.2+的依赖对齐策略可能改变了Hadoop相关组件的类加载优先级,进一步加剧了该问题。
排查步骤
- 执行依赖树命令对比版本差异:
- Maven:
mvn dependency:tree - Gradle:
./gradlew dependencies - 重点查看
org.apache.commons:commons-compress的版本变化,以及Hadoop核心依赖(hadoop-common、hadoop-hdfs)是否被意外覆盖或排除
- Maven:
- 核对Hadoop 3.3.6官方依赖清单,确认其兼容的
commons-compress版本为1.21
解决方案
方案1:强制指定兼容的commons-compress版本
在项目的依赖管理块中锁定Hadoop兼容的版本,覆盖Spring Boot的默认版本:
<!-- Maven --> <dependencyManagement> <dependencies> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-compress</artifactId> <version>1.21</version> </dependency> </dependencies> </dependencyManagement>
// Gradle dependencyManagement { imports { mavenBom "org.apache.commons:commons-compress:1.21" } }
方案2:排除冲突依赖后手动引入兼容版本
在Spring Boot starter依赖中排除高版本的commons-compress,再手动添加兼容版本:
<!-- Maven --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.apache.commons</groupId> <artifactId>commons-compress</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-compress</artifactId> <version>1.21</version> </dependency>
方案3:调整类加载优先级
如果是类加载顺序导致的实现类无法被发现,在Spring Boot启动参数中添加:
-Dhadoop.classpath.first=true
让Hadoop相关类优先加载,避免被Spring Boot的类加载器覆盖。
验证步骤
修改依赖或启动参数后,重新构建并启动应用,调用DistCP API,确认UnsupportedFileSystemException不再抛出。
内容的提问来源于stack exchange,提问作者Girish
相关产品推荐
相关产品推荐

