AWS SDK v2中S3Client与S3TransferManager共存冲突解决问询
问题:AWS SDK v2 S3与S3TransferManager依赖冲突导致NoSuchMethodError
场景说明
我正在开发Java项目,使用AWS SDK v2操作S3服务:
- 通过
S3Client调用getObject()、listObjects()等接口 - 借助
S3TransferManager实现文件上传/下载的日志记录
代码示例
static String sAccessKey = "XXXXXXXXXX"; static String sSecretKey = "XXXXXXXXXXXXX"; static AwsBasicCredentials awsCreds = AwsBasicCredentials.create( sAccessKey, sSecretKey); AwsCredentialsProvider awsCredentialsProvider = StaticCredentialsProvider.create(awsCreds); static S3Client s3Client = S3Client.builder().region(Region.US_WEST_2) .credentialsProvider(StaticCredentialsProvider.create(awsCreds)) .build(); S3TransferManager s3TransferManager = S3TransferManager .builder() .s3ClientConfiguration(S3ClientConfiguration.builder() .region(Region.US_WEST_2) .credentialsProvider(awsCredentialsProvider).build()).build(); S3TransferManager s3TransferManager1 = S3TransferManager.create(); Region region = Region.US_WEST_2; S3ClientConfiguration s3ClientConfiguration = S3ClientConfiguration.builder() .region(region) .credentialsProvider(awsCredentialsProvider) .targetThroughputInGbps(20.0) .build(); Upload upload = s3TransferManager1.upload(b -> b.putObjectRequest(r -> r.bucket("SSSS").key("test.ppt")) .source(Paths.get("fileToUpload.txt")));
错误信息
Exception in thread "main" java.lang.NoSuchMethodError: software.amazon.awssdk.utils.Validate.isPositiveOrNull(Ljava/lang/Double;Ljava/lang/String;)Ljava/lang/Double; at software.amazon.awssdk.transfer.s3.S3ClientConfiguration.<init>(S3ClientConfiguration.java:49) at software.amazon.awssdk.transfer.s3.S3ClientConfiguration.<init>(S3ClientConfiguration.java:37) at software.amazon.awssdk.transfer.s3.S3ClientConfiguration$DefaultBuilder.build(S3ClientConfiguration.java:301) at software.amazon.awssdk.transfer.s3.S3ClientConfiguration$DefaultBuilder.build(S3ClientConfiguration.java:243) at software.amazon.awssdk.transfer.s3.internal.DefaultS3TransferManager$DefaultBuilder.<init>(DefaultS3TransferManager.java:405) at software.amazon.awssdk.transfer.s3.internal.DefaultS3TransferManager$DefaultBuilder.<init>(DefaultS3TransferManager.java:404) at software.amazon.awssdk.transfer.s3.internal.DefaultS3TransferManager.builder(DefaultS3TransferManager.java:364) at software.amazon.awssdk.transfer.s3.S3TransferManager.builder(S3TransferManager.java:497) at com.bucketexplorer.main.SdkTest.main(SdkTest.java:88)
依赖冲突原因
当前引入的两个Jar包版本差异过大,导致内部工具类方法不兼容:
s3-2.16.46.jars3-transfer-manager-2.17.257-PREVIEW.jar
解决方案
1. 统一所有AWS SDK v2组件版本
AWS SDK v2的所有核心组件(包括S3、TransferManager)必须使用完全一致的版本,否则会因为内部依赖的工具类、核心API版本不匹配出现方法缺失错误。
- 优先将
s3-2.16.46.jar升级到2.17.257版本,与TransferManager保持一致;若TransferManager预览版在旧版本不可用,请勿降级TransferManager。
2. 使用依赖管理工具统一版本(推荐)
通过Maven或Gradle的版本管理功能,强制所有AWS SDK依赖使用同一版本,避免手动引入不同版本Jar包:
- Maven配置:
<properties> <aws.sdk.version>2.17.257</aws.sdk.version> </properties> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>s3</artifactId> <version>${aws.sdk.version}</version> </dependency> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>s3-transfer-manager</artifactId> <version>${aws.sdk.version}</version> </dependency> </dependencies>
- Gradle配置:
plugins { id 'java' } repositories { mavenCentral() } dependencies { implementation platform('software.amazon.awssdk:bom:2.17.257') implementation 'software.amazon.awssdk:s3' implementation 'software.amazon.awssdk:s3-transfer-manager' }
3. 清理冲突依赖
检查项目依赖树,排除旧版本的AWS核心工具类Jar包:
- Maven执行
mvn dependency:tree查看依赖树,找到冲突的aws-sdk-core或utils依赖,通过<exclusions>标签排除旧版本 - Gradle执行
./gradlew dependencies查看依赖树,通过exclude方法移除冲突依赖
内容的提问来源于stack exchange,提问作者santosh
相关产品推荐
相关产品推荐

