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,或者插件自动拉取了某些隐藏的依赖,这部分不会出现在常规的依赖树里。
二、具体排查步骤
精准过滤AWS相关依赖
执行带过滤和详细参数的依赖树命令,只看AWS的包,更容易定位:mvn dependency:tree -Dverbose -Dincludes=com.amazonaws:*-Dverbose会显示所有被排除的依赖,哪怕它们没被最终引入,能帮你确认旧版本是不是被仲裁排除了但又被其他方式带进来。检查
hadoop-client的依赖详情
直接查看你使用的hadoop-client版本的依赖声明:mvn dependency:describe -DgroupId=org.apache.hadoop -DartifactId=hadoop-client -Dversion=你的hadoop版本输出里会列出它的所有依赖,包括scope和optional属性,看看有没有
aws-java-sdk-1.7.4的痕迹。检查本地仓库的
hadoop-clientpom
去你的本地Maven仓库路径(比如~/.m2/repository/org/apache/hadoop/hadoop-client/[你的版本]/)打开hadoop-client.pom,手动搜索com.amazonaws,确认是否有隐藏的依赖声明——有些第三方修改过的jar包会出现这种情况。检查打包插件配置
看看项目中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

