使用AWS SDK V2对接LocalStack的S3时出现ClassNotFoundException问题求助
问题成因
你当前使用的1.16.0版本Testcontainers LocalStack组件,内部默认依赖AWS SDK V1的核心模块,实现逻辑中用到了com.amazonaws.auth.AWSCredentials这个V1专属的类。而你的Gradle配置中,com.amazonaws:aws-java-sdk-s3这行依赖末尾带了*/注释符号,导致该V1依赖实际没有被引入项目。
AWS SDK V2和V1的包命名空间完全隔离,V2的认证类为software.amazon.awssdk.auth.credentials.AwsCredentials,和V1的类不兼容,因此运行时会抛出类找不到异常。你替换成V1版本SDK后,项目存在对应的AWSCredentials类,异常自然消失。
解决方案(保留AWS SDK V2的前提下)
- 方案1:补充AWS SDK V1核心依赖
无需引入完整的V1 S3 SDK,仅引入包含目标类的core包即可,V1和V2 SDK包名完全隔离,不会产生冲突:
implementation group: 'com.amazonaws', name: 'aws-java-sdk-core', version: '1.12.300'
同时建议删除你原有配置中末尾带*/的无效V1 S3依赖行,避免配置冗余。
- 方案2:升级Testcontainers版本
1.17.0及以上版本的Testcontainers LocalStack组件已经移除了对AWS SDK V1的强制依赖,无需额外引入V1相关包即可适配AWS SDK V2,直接升级依赖版本即可:
implementation "org.testcontainers:localstack:1.17.6" implementation "org.testcontainers:testcontainers:1.17.6"
- 附加配置注意项
使用AWS SDK V2对接LocalStack时,需要手动开启路径样式访问,避免签名校验错误,客户端构建参考代码如下:
S3Client s3Client = S3Client.builder() .endpointOverride(localStackContainer.getEndpointOverride(LocalStackContainer.Service.S3)) .region(Region.of(localStackContainer.getRegion())) .credentialsProvider(StaticCredentialsProvider.create( AwsBasicCredentials.create(localStackContainer.getAccessKey(), localStackContainer.getSecretKey()) )) .serviceConfiguration(config -> config.pathStyleAccessEnabled(true)) .build();
内容的提问来源于stack exchange,提问作者coder25
相关产品推荐
相关产品推荐

