AWS SDK for Java V2写Lambda创建S3桶报NoSuchFieldError: PROFILE_FILE错误
java.lang.NoSuchFieldError: PROFILE_FILE 错误本质是AWS SDK for Java V2的依赖版本冲突导致的。该字段定义在software.amazon.awssdk:sdk-core模块中,当项目中引入的不同AWS SDK模块(如s3、core)版本不一致时,高版本的S3模块调用低版本core模块中不存在的字段就会触发该错误。同时Lambda运行环境内置的AWS SDK版本和你打包上传的版本不一致也会触发该冲突。
统一所有AWS SDK依赖版本,使用官方BOM管理依赖
直接通过AWS官方提供的BOM统一管理所有SDK模块版本,避免不同模块版本不一致问题,Maven配置示例如下:<dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>bom</artifactId> <version>2.20.0</version> <!-- 替换为官方最新稳定版即可 --> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>s3</artifactId> </dependency> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>lambda</artifactId> </dependency> </dependencies>Gradle配置示例:
dependencies { implementation platform('software.amazon.awssdk:bom:2.20.0') implementation 'software.amazon.awssdk:s3' implementation 'software.amazon.awssdk:lambda' }显式指定Lambda环境凭证提供者,跳过本地配置文件读取逻辑
Lambda运行时本身已经通过执行角色提供了权限,不需要客户端默认加载本地profile文件,可以在构造S3Client时显式指定凭证提供者,绕开PROFILE_FILE相关的加载逻辑:S3Client s3Client = S3Client.builder() .region(region) .credentialsProvider(LambdaCredentialsProvider.create()) // 新增该行配置 .build();解决Lambda运行环境内置SDK冲突
如果统一版本后仍报错,可以用Maven Shade插件或者Gradle Shadow插件将你的依赖重命名,避免和Lambda内置的SDK类冲突,Maven Shade配置示例:<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.4.1</version> <configuration> <relocations> <relocation> <pattern>software.amazon.awssdk</pattern> <shadedPattern>shaded.software.amazon.awssdk</shadedPattern> </relocation> </relocations> </configuration> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> </execution> </executions> </plugin>排查依赖树确认无版本冲突
执行mvn dependency:tree(Maven)或者./gradlew dependencies(Gradle)检查所有software.amazon.awssdk开头的依赖版本是否完全一致,排除掉引入的低版本core等传递依赖。
内容的提问来源于stack exchange,提问作者Jithin Kumar S

