开始使用 AWS SDK for Java 2.x - AWS SDK for Java 2.x

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

开始使用 AWS SDK for Java 2.x

为 Amazon Web Services (AWS) AWS SDK for Java 2.x 提供了 Java API。使用 SDK,您可以构建与、Amazon S3Amazon EC2、DynamoDB等配合使用的 Java 应用程序。

本教程向您展示如何使用 Apache Maven 为 Java 2.x 的 SDK 定义依赖关系,然后编写Amazon S3连接到上传文件的代码。

请按照以下步骤完成本教程:

步骤:设置本教程为本教程设置本教程设置本教

在开始本教程之前,您需要做好以下准备:

  • 访问权限 Amazon S3

  • 配置为AWS 服务使用单点登录进行访问的 Java 开发环境 AWS IAM Identity Center (successor to AWS Single Sign-On)

按照中的基本设置说明为本教程进行设置。在将开发环境配置为 Java SDK 的单点登录访问权限并拥有有效的AWS访问门户会话后,继续执行本教程的步骤 2。

步骤:创建项目:创建项目。创建项目。创建项目

要为本教程创建项目,请运行 Maven 命令,提示您输入有关如何配置项目的输入。输入并确认所有输入后,Maven 通过创建存根 Java 文件来完成项目的构建。pom.xml

  1. 打开终端或命令提示符窗口并导航到您选择的目录,例如,您的DesktopHome文件夹。

  2. 在终端输入以下命令并按Enter

    mvn archetype:generate \ -DarchetypeGroupId=software.amazon.awssdk \ -DarchetypeArtifactId=archetype-app-quickstart \ -DarchetypeVersion=2.20.43
  3. 为每个提示输入第二列中列出的值。

    提示 要输入的值
    Define value for property 'service': s3
    Define value for property 'httpClient': apache-client
    Define value for property 'nativeImage': false
    Define value for property 'credentialProvider' identity-center
    Define value for property 'groupId': org.example
    Define value for property 'artifactId': getstarted
    Define value for property 'version' 1.0-SNAPSHOT: <Enter>
    Define value for property 'package' org.example: <Enter>
  4. 输入最后一个值后,Maven 会列出你所做的选择。通过输入进行确认,Y或通过输入重新输入值。N

Maven 会getstarted根据您输入的artifactId值创建名为的项目文件夹。在getstarted文件夹中,README.md找到可以查看的pom.xml文件、文件和src目录。

Maven 构建了以下目录树。

getstarted ├── README.md ├── pom.xml └── src ├── main │   ├── java │   │   └── org │   │   └── example │   │   ├── App.java │   │   ├── DependencyFactory.java │   │   └── Handler.java │   └── resources │   └── simplelogger.properties └── test └── java └── org └── example └── HandlerTest.java 10 directories, 7 files

下面显示pom.xml项目文件的内容。

dependencyManagement部分包含对的依赖项AWS SDK for Java 2.x,该dependencies部分包含Amazon S3 的依赖项。该项目使用 Java 1.8,因为maven.compiler.sourcemaven.compiler.target属性中有1.8值。

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.example</groupId> <artifactId>getstarted</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <maven.shade.plugin.version>3.2.1</maven.shade.plugin.version> <maven.compiler.plugin.version>3.6.1</maven.compiler.plugin.version> <exec-maven-plugin.version>1.6.0</exec-maven-plugin.version> <aws.java.sdk.version>2.20.43</aws.java.sdk.version> <-------- SDK version picked up from archetype version. <slf4j.version>1.7.28</slf4j.version> <junit5.version>5.8.1</junit5.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>bom</artifactId> <version>${aws.java.sdk.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>s3</artifactId> <-------- S3 dependency <exclusions> <exclusion> <groupId>software.amazon.awssdk</groupId> <artifactId>netty-nio-client</artifactId> </exclusion> <exclusion> <groupId>software.amazon.awssdk</groupId> <artifactId>apache-client</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>sso</artifactId> <-------- Required for identity center authentication. </dependency> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>ssooidc</artifactId> <-------- Required for identity center authentication. </dependency> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>apache-client</artifactId> <-------- HTTP client specified. <exclusions> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${slf4j.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>${slf4j.version}</version> </dependency> <!-- Needed to adapt Apache Commons Logging used by Apache HTTP Client to Slf4j to avoid ClassNotFoundException: org.apache.commons.logging.impl.LogFactoryImpl during runtime --> <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> <version>${slf4j.version}</version> </dependency> <!-- Test Dependencies --> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter</artifactId> <version>${junit5.version}</version> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>${maven.compiler.plugin.version}</version> </plugin> </plugins> </build> </project>

步骤:编写代码:编写代码:编写代码:编写代码

以下代码显示了由 Maven 创建的App类。该main方法是应用程序的入口点,它创建了该Handler类的实例,然后调用其sendRequest方法。

package org.example; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class App { private static final Logger logger = LoggerFactory.getLogger(App.class); public static void main(String... args) { logger.info("Application starts"); Handler handler = new Handler(); handler.sendRequest(); logger.info("Application ends"); } }

由 Maven 创建的DependencyFactory类包含用于生成和返回S3Client实例的s3Client工厂方法。该S3Client实例使用基于 Apache 的 HTTP 客户端的实例。这是因为您在 Maven 提示您使用哪个 HTTP 客户端apache-client时指定了。

DependencyFactory如以下代码所示。

package org.example; import software.amazon.awssdk.http.apache.ApacheHttpClient; import software.amazon.awssdk.services.s3.S3Client; /** * The module containing all dependencies required by the {@link Handler}. */ public class DependencyFactory { private DependencyFactory() {} /** * @return an instance of S3Client */ public static S3Client s3Client() { return S3Client.builder() .httpClientBuilder(ApacheHttpClient.builder()) .build(); } }

Handler类包含您的程序的主要逻辑。在App类中创建Handler的实例时,会DependencyFactory提供S3Client服务客户端。您的代码使用S3Client实例调用 Amazon S3 服务。

Maven 使用TODO注释生成以下Handler类。本教程的下一步将替换为TODO代码。

package org.example; import software.amazon.awssdk.services.s3.S3Client; public class Handler { private final S3Client s3Client; public Handler() { s3Client = DependencyFactory.s3Client(); } public void sendRequest() { // TODO: invoking the api calls using s3Client. } }

要填写逻辑,请将该Handler类的全部内容替换为以下代码。填写sendRequest方法并添加必要的导入。

该代码首先使用生成的名称的最后一部分创建一个新的 S3 存储桶,System.currentTimeMillis()以使存储段名称独一无二。

createBucket()方法中创建存储段后,程序使用putObject方法上传对象。S3Client该对象的内容是使用该RequestBody.fromString方法创建的简单字符串。

最后,程序在cleanUp方法中删除对象,然后删除存储桶。

package org.example; import software.amazon.awssdk.core.sync.RequestBody; import software.amazon.awssdk.services.s3.S3Client; import software.amazon.awssdk.services.s3.model.CreateBucketRequest; import software.amazon.awssdk.services.s3.model.DeleteBucketRequest; import software.amazon.awssdk.services.s3.model.DeleteObjectRequest; import software.amazon.awssdk.services.s3.model.HeadBucketRequest; import software.amazon.awssdk.services.s3.model.PutObjectRequest; import software.amazon.awssdk.services.s3.model.S3Exception; public class Handler { private final S3Client s3Client; public Handler() { s3Client = DependencyFactory.s3Client(); } public void sendRequest() { String bucket = "bucket" + System.currentTimeMillis(); String key = "key"; createBucket(s3Client, bucket); System.out.println("Uploading object..."); s3Client.putObject(PutObjectRequest.builder().bucket(bucket).key(key) .build(), RequestBody.fromString("Testing with the {sdk-java}")); System.out.println("Upload complete"); System.out.printf("%n"); cleanUp(s3Client, bucket, key); System.out.println("Closing the connection to {S3}"); s3Client.close(); System.out.println("Connection closed"); System.out.println("Exiting..."); } public static void createBucket(S3Client s3Client, String bucketName) { try { s3Client.createBucket(CreateBucketRequest .builder() .bucket(bucketName) .build()); System.out.println("Creating bucket: " + bucketName); s3Client.waiter().waitUntilBucketExists(HeadBucketRequest.builder() .bucket(bucketName) .build()); System.out.println(bucketName + " is ready."); System.out.printf("%n"); } catch (S3Exception e) { System.err.println(e.awsErrorDetails().errorMessage()); System.exit(1); } } public static void cleanUp(S3Client s3Client, String bucketName, String keyName) { System.out.println("Cleaning up..."); try { System.out.println("Deleting object: " + keyName); DeleteObjectRequest deleteObjectRequest = DeleteObjectRequest.builder().bucket(bucketName).key(keyName).build(); s3Client.deleteObject(deleteObjectRequest); System.out.println(keyName + " has been deleted."); System.out.println("Deleting bucket: " + bucketName); DeleteBucketRequest deleteBucketRequest = DeleteBucketRequest.builder().bucket(bucketName).build(); s3Client.deleteBucket(deleteBucketRequest); System.out.println(bucketName + " has been deleted."); System.out.printf("%n"); } catch (S3Exception e) { System.err.println(e.awsErrorDetails().errorMessage()); System.exit(1); } System.out.println("Cleanup complete"); System.out.printf("%n"); } }

步骤:构建并运行应用程序。构建并运行应用程序。构建并运行应用程序。

创建项目并包含完整Handler类后,生成并运行应用程序。

  1. 确保您的 IAM 身份中心会话处于活动的 IAM 身份中心会话。为此,请运行AWS Command Line Interface命令aws sts get-caller-identity并检查响应。如果您没有活跃会话,请查看此部分了解说明。

  2. 打开终端或命令提示窗口并导航至您的项目目录getstarted

  3. 使用以下命令来生成项目:

    mvn clean package
  4. 使用以下命令运行应用程序。

    mvn exec:java -Dexec.mainClass="org.example.App"

要查看程序创建的新存储分区和对象,请执行以下步骤。

  1. 输入Handler.java,注释掉sendRequest方法cleanUp(s3Client, bucket, key)中的行并保存文件。

  2. 通过运行来重建项目mvn clean package

  3. 重新运行mvn exec:java -Dexec.mainClass="org.example.App"以再次上传文本对象。

  4. 登录 S3 控制台,在新创建的存储桶中查看新对象。

查看文件后,删除对象,然后删除存储桶。

成功

如果你的 Maven 项目在构建和运行时没有出现错误,那么恭喜!您已经使用适用于 Java 的 SDK 2.x 成功构建了您的第一个 Java 应用程序。

清除

要清理您在本教程中创建资源,请执行以下操作:

  • 如果您尚未这样做,请在 S3 控制台中删除运行应用程序时创建的所有对象和存储桶。

  • IAM控制台中,删除 TestSDK 用户。

    如果您删除此用户,请同时删除您在安装过程中创建的credentials文件的内容。

  • 删除项目文件夹 (getstarted)。

后续步骤

现在您已掌握基础知识: