[英]Creating an Amazon S3 bucket Using the AWS SDK for Java v2 : Exception in thread "main" java.lang.NoClassDefFoundError
[英]Creating an Amazon S3 bucket Using the AWS SDK for Java : Exception in thread "main" java.lang.NoClassDefFoundError
尝试使用 java API 创建 s3 存储桶时出现以下错误:
Error: Exception in thread "main" java.lang.NoClassDefFoundError: software/amazon/awssdk/protocols/query/internal/unmarshall/AwsXmlErrorUnmarshaller at software.amazon.awssdk.protocols.xml.internal.unmarshall.AwsXmlErrorTransformer.(AwsXmlErrorTransformer.java :40) at software.amazon.awssdk.protocols.xml.internal.unmarshall.AwsXmlErrorTransformer.(AwsXmlErrorTransformer.java:34) at software.amazon.awssdk.protocols.xml.internal.unmarshall.AwsXmlErrorTransformer$Builder.build(AwsXmlErrorTransformer. java:113) at software.amazon.awssdk.protocols.xml.AwsXmlProtocolFactory.createErrorTransformer(AwsXmlProtocolFactory.java:135) at software.amazon.awssdk.protocols.xml.AwsS3ProtocolFactory.create ErrorCouldBeInBodyResponseHandler(AwsS3ProtocolFactory.java:80) at software.amazon.awssdk.services.s3.DefaultS3Client.createBucket(DefaultS3Client.java:1144) at com.act.niti.main(niti.java:33) Caused by: java.lang .ClassNotFoundException: software.amazon.awssdk.protocols.query.internal.unmarshall.AwsXmlErrorUnmarshaller at java.net.URLClassLoader.findClass(URLClassLoader.java:382) at java.lang.ClassLoader.loadClass(ClassLoader.java:418) at sun .misc.Launcher$AppClassLoader.loadClass(Launcher.java:355) 在 java.lang.ClassLoader.loadClass(ClassLoader.Z93F725A07423FE21F886F).
代码:
try {
Region region = Region.US_EAST_2;
S3Client s3 = S3Client.builder()
.region(region)
.build();
S3Waiter s3Waiter = s3.waiter();
CreateBucketRequest bucketRequest = CreateBucketRequest.builder()
.bucket("abc")
.build();
s3.createBucket(bucketRequest); //creating s3 bucket
System.out.println("bucket........abc");
HeadBucketRequest bucketRequestWait = HeadBucketRequest.builder()
.bucket("abc")
.build();
// Wait until the bucket is created and print out the response
WaiterResponse<HeadBucketResponse> waiterResponse =
s3Waiter.waitUntilBucketExists(bucketRequestWait);
waiterResponse.matched().response().ifPresent(System.out::println);
System.out.println("abc" +" is ready");
} catch (S3Exception e) {
System.err.println(e.awsErrorDetails().errorMessage());
System.exit(1);
}
Note : Using java 8
POM Xml:
<dependencies>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk</artifactId>
<version>1.11.570</version>
</dependency>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>s3</artifactId>
<version>2.17.269</version>
</dependency>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>ec2</artifactId>
<version>2.5.10</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.10</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk-gamelift -->
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-gamelift</artifactId>
<version>1.11.647</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.8.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.8.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-commons</artifactId>
<version>1.8.2</version>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-launcher</artifactId>
<version>1.8.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>s3-transfer-manager</artifactId>
<version>2.17.103-PREVIEW</version>
</dependency>
<dependencies>
看起来您在 POM 文件中混合了 V1 和 V2。 你有
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk</artifactId>
<version>1.11.570</version>
</dependency>
使用 AWS SDK for V2 时不需要此 Dep。 S3Client是一个 V2 服务客户端。 事实上 - 您的错误很可能与在您的 POM 文件中混合 SDK 版本有关。
您应该使用的 POM 文件可以在此处的 AWS Github 存储库中找到:
https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javav2/example_code/s3
如果您对 Java v2 的 AWS SDK不熟悉,请参阅开发指南:
https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/home.html
当您使用正确的 POM 文件时,V2 Java 代码在这里:
package com.example.s3;
// snippet-start:[s3.java2.create_bucket_waiters.import]
import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider;
import software.amazon.awssdk.core.waiters.WaiterResponse;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.CreateBucketRequest;
import software.amazon.awssdk.services.s3.model.HeadBucketRequest;
import software.amazon.awssdk.services.s3.model.HeadBucketResponse;
import software.amazon.awssdk.services.s3.model.S3Exception;
import software.amazon.awssdk.services.s3.waiters.S3Waiter;
import java.net.URISyntaxException;
// snippet-end:[s3.java2.create_bucket_waiters.import]
/**
* Before running this Java V2 code example, set up your development environment, including your credentials.
*
* For more information, see the following documentation topic:
*
* https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html
*/
public class CreateBucket {
public static void main(String[] args) throws URISyntaxException {
final String usage = "\n" +
"Usage:\n" +
" <bucketName> \n\n" +
"Where:\n" +
" bucketName - The name of the bucket to create. The bucket name must be unique, or an error occurs.\n\n" ;
if (args.length != 1) {
System.out.println(usage);
System.exit(1);
}
String bucketName = args[0];
System.out.format("Creating a bucket named %s\n", bucketName);
ProfileCredentialsProvider credentialsProvider = ProfileCredentialsProvider.create();
Region region = Region.US_EAST_1;
S3Client s3 = S3Client.builder()
.region(region)
.credentialsProvider(credentialsProvider)
.build();
createBucket (s3, bucketName);
s3.close();
}
// snippet-start:[s3.java2.create_bucket_waiters.main]
public static void createBucket( S3Client s3Client, String bucketName) {
try {
S3Waiter s3Waiter = s3Client.waiter();
CreateBucketRequest bucketRequest = CreateBucketRequest.builder()
.bucket(bucketName)
.build();
s3Client.createBucket(bucketRequest);
HeadBucketRequest bucketRequestWait = HeadBucketRequest.builder()
.bucket(bucketName)
.build();
// Wait until the bucket is created and print out the response.
WaiterResponse<HeadBucketResponse> waiterResponse = s3Waiter.waitUntilBucketExists(bucketRequestWait);
waiterResponse.matched().response().ifPresent(System.out::println);
System.out.println(bucketName +" is ready");
} catch (S3Exception e) {
System.err.println(e.awsErrorDetails().errorMessage());
System.exit(1);
}
}
// snippet-end:[s3.java2.create_bucket_waiters.main]
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.