Scala胖jar中AWS SDK ExecutionInterceptorChain缺失S3拦截器问题
问题分析与解决方案
核心原因:execution.interceptors 文件合并策略错误
你遇到的问题大概率是first合并策略导致的。AWS SDK每个服务(比如S3)都会在software/amazon/awssdk/services/{service}/execution.interceptors文件里声明专属拦截器,构建胖jar时如果存在多个这类文件,first策略只会保留第一个被扫描到的内容,S3的拦截器配置直接被覆盖,自然无法加载对应的拦截器类。
验证方法
解压你的胖jar,对比两处的software/amazon/awssdk/services/s3/execution.interceptors文件:
- 本地依赖中的该文件,应该包含
software.amazon.awssdk.services.s3.internal.handlers相关的拦截器条目 - 胖jar里的同名文件,大概率没有这些S3专属的配置内容,甚至可能是其他服务的配置
修复步骤:修改合并策略
在build.sbt里给AWS SDK的拦截器配置文件单独设置concat合并策略,把所有服务的配置内容拼接在一起:
assemblyMergeStrategy in assembly := { // 针对AWS SDK的服务拦截器配置文件,使用concat合并 case PathList("software", "amazon", "awssdk", "services", _, "execution.interceptors") => MergeStrategy.concat // 保留你原有的其他合并规则 case other => val originalStrategy = (assemblyMergeStrategy in assembly).value originalStrategy(other) }
其他排查方向
- 依赖范围错误:检查S3相关依赖的
scope是否设为provided或test,这种情况下胖jar不会打包这些依赖,直接导致拦截器类缺失。确保依赖是默认的compile范围:libraryDependencies += "software.amazon.awssdk" % "s3" % "2.x.x" // 替换成你实际使用的版本 - 类加载器差异:本地运行时用的是SBT/IntelliJ的类加载器,能读取所有依赖的资源文件;而胖jar使用系统类加载器,资源文件合并错误就无法被正确读取。还要确认有没有其他插件或配置删除了这类资源文件。
- 版本冲突:检查AWS SDK各模块的版本是否一致,混合不同版本的SDK模块可能导致拦截器加载逻辑异常。
内容的提问来源于stack exchange,提问作者jbogart
相关产品推荐
相关产品推荐

