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

Maven多模块项目中AWS SDK旧版本未在依赖树显示却被打包

排查Maven多模块项目中AWS SDK依赖隐藏的问题

这种情况确实挺挠头的——明明打包产物里躺着aws-java-sdk-1.7.4.jar,但mvn dependency:tree却查不到它的来源,结合你怀疑的hadoop-client,我梳理了几个最可能的原因和对应的排查、解决方法:

一、为什么依赖树看不到旧版本SDK?

1. 你可能没查全所有模块的依赖

多模块项目里,mvn dependency:tree默认只会分析当前执行命令的模块(比如父模块),如果旧版本SDK是某个子模块间接引入的,父模块的依赖树可能不会显示。另外,普通的依赖树不会显示被排除的依赖,如果旧版本被Maven的依赖仲裁排除了,但某些特殊情况又被打包进来,也会出现这种矛盾。

2. hadoop-client的依赖方式特殊

有些版本的hadoop-client会把AWS SDK依赖标记为<optional>true</optional>或者<scope>runtime</scope>,虽然默认dependency:tree会显示这些依赖,但如果你的命令没加参数,可能会被忽略;更极端的情况是,某些第三方分发的hadoop-client包,其本地仓库中的pom文件和官方不一致,偷偷引入了旧版本SDK但没在公开pom里声明。

3. 打包插件额外引入了这个jar

如果你的项目用了maven-shade-plugin、maven-assembly-plugin这类自定义打包插件,有可能在插件配置里手动指定了包含aws-java-sdk-1.7.4.jar,或者插件自动拉取了某些隐藏的依赖,这部分不会出现在常规的依赖树里。

二、具体排查步骤

  1. 精准过滤AWS相关依赖
    执行带过滤和详细参数的依赖树命令,只看AWS的包,更容易定位:

    mvn dependency:tree -Dverbose -Dincludes=com.amazonaws:*
    

    -Dverbose会显示所有被排除的依赖,哪怕它们没被最终引入,能帮你确认旧版本是不是被仲裁排除了但又被其他方式带进来。

  2. 检查hadoop-client的依赖详情
    直接查看你使用的hadoop-client版本的依赖声明:

    mvn dependency:describe -DgroupId=org.apache.hadoop -DartifactId=hadoop-client -Dversion=你的hadoop版本
    

    输出里会列出它的所有依赖,包括scope和optional属性,看看有没有aws-java-sdk-1.7.4的痕迹。

  3. 检查本地仓库的hadoop-client pom
    去你的本地Maven仓库路径(比如~/.m2/repository/org/apache/hadoop/hadoop-client/[你的版本]/)打开hadoop-client.pom,手动搜索com.amazonaws,确认是否有隐藏的依赖声明——有些第三方修改过的jar包会出现这种情况。

  4. 检查打包插件配置
    看看项目中pom.xml里的maven-shade-plugin或maven-assembly-plugin配置,有没有手动引入aws-java-sdk-1.7.4的规则,或者是否开启了自动引入依赖的选项导致漏网之鱼。

三、解决方法

如果最终确认是hadoop-client带来的旧版本SDK,直接在hadoop-client的依赖中排除所有AWS相关包即可:

<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-client</artifactId>
    <version>你的hadoop版本</version>
    <exclusions>
        <!-- 排除旧版本的aws-java-sdk -->
        <exclusion>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-java-sdk</artifactId>
        </exclusion>
        <!-- 同时排除可能的核心包,避免遗漏 -->
        <exclusion>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-java-sdk-core</artifactId>
        </exclusion>
        <!-- 如果还有其他AWS相关子包,也一并排除 -->
    </exclusions>
</dependency>

排除后再执行打包,产物里应该就只会保留你显式引入的aws-java-sdk-core-1.10.6.jar了。

内容的提问来源于stack exchange,提问作者Johnny

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:21:31