

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

# 带示例的迁移 step-by-step说明
<a name="migration-steps"></a>

本节提供了将当前使用适用于 Java 的 SDK v1.x 的应用程序迁移到适用于 Java 2.x 的 SDK 的 step-by-step指南。第一部分概述了各个步骤，然后是详细的迁移示例。

此处介绍的步骤描述了正常用例的迁移，即应用程序 AWS 服务 使用模型驱动的服务客户端进行调用。如果您需要迁移使用更高级别的代码， APIs 例如 [S3 传输管理器](migration-s3-transfer-manager.md)或[CloudFront预签名](migration-cloudfront-presigning.md)，请参阅[适用于 Java 的 AWS SDK 1.x 和 2.x 有什么区别](migration-whats-different.md)目录下的部分。



此处描述的方法仅为建议。您可以使用其他技术并利用 IDE 的代码编辑功能来获得相同的结果。

## 步骤概述
<a name="migration-steps-overview"></a>

### 1. 首先添加适用于 Java 的 SDK 2.x BOM
<a name="migration-steps-overview-step1"></a>

通过将适用于 Java 的 SDK 2.x 的 Maven BOM（物料清单）元素添加到您的 POM 文件中，可以确保所需的所有 v2 依赖项都来自同一个版本。您的 POM 可以同时包含 v1 和 v2 依赖项。这样您就可以通过增量方式迁移代码，而不必一次全部更改。

#### 适用于 Java 的 SDK 2.x BOM
<a name="drt_b5n_q1c"></a>

```
<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>software.amazon.awssdk</groupId>
      <artifactId>bom</artifactId>
      <version>{{2.27.21}}</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>
```

您可以在 Maven Central 存储库中找到[最新版本](https://central.sonatype.com/artifact/software.amazon.awssdk/bom)。

### 2. 在文件中搜索 v1 类导入语句
<a name="migration-steps-overview-step2"></a>

通过扫描应用程序中的文件，寻找在 v1 导入中使用的 SERVICE\_，你会发现所IDs 使用的唯一的 S IDs ERVICE\_。SERVICE\_ID 是一个简短、唯一的名称。 AWS 服务例如，`cognitoidentity` 是 Amazon Cognito Identity 的 SERVICE\_ID。

### 3. 从 v1 导入语句中确定 v2 Maven 依赖项
<a name="migration-steps-overview-step3"></a>

找到所有唯一的 v1 SERVICE\_ 后IDs，你可以通过参考来确定 v2 依赖项的相应的 Maven 工件。[软件包名称到 Maven artifactId 的映射](#migration-serviceid-artifactid-mapping)

### 4. 将 v2 依赖项元素添加到 POM 文件中
<a name="migration-steps-overview-step4"></a>

使用步骤 3 中确定的依赖项元素更新 Maven POM 文件。

### 5. 在 Java 文件中，逐渐将 v1 类更改为 v2 类
<a name="migration-steps-overview-step5"></a>

在用 v2 类替换 v1 类时，请进行必要的更改以支持 v2 API，例如使用生成器而不是构造函数，以及使用 fluent getter 和 setter。

### 6. 从 POM 中移除 v1 Maven 依赖项，从文件中移除 v1 导入
<a name="migration-steps-overview-step6"></a>

将代码迁移到使用 v2 类后，从文件中移除所有剩余的 v1 导入，并从构建文件中移除所有依赖项。

### 7. 重构代码以使用 v2 API 增强功能
<a name="migration-steps-overview-step7"></a>

代码成功编译并通过测试后，您可以利用 v2 增强功能，例如使用不同的 HTTP 客户端或分页器来简化代码。此为可选步骤。

## 示例迁移
<a name="migration-steps-example"></a>

在此示例中，我们迁移了一个使用适用于 Java 的 SDK v1 并可以访问多个 AWS 服务的应用程序。我们在步骤 5 中详细解析了以下 v1 方法。这是包含八个方法的类中的一个方法，应用程序中有 32 个类。

### 要迁移的 v1 方法
<a name="v1-snippet-collapsed"></a>

下面仅列出了来自 Java 文件的 v1 SDK 导入。

```
import com.amazonaws.ClientConfiguration;
import com.amazonaws.regions.Region;
import com.amazonaws.regions.RegionUtils;
import com.amazonaws.services.ec2.AmazonEC2Client;
import com.amazonaws.services.ec2.model.AmazonEC2Exception;
import com.amazonaws.services.ec2.model.CreateTagsRequest;
import com.amazonaws.services.ec2.model.DescribeInstancesRequest;
import com.amazonaws.services.ec2.model.DescribeInstancesResult;
import com.amazonaws.services.ec2.model.Instance;
import com.amazonaws.services.ec2.model.InstanceStateName;
import com.amazonaws.services.ec2.model.Reservation;
import com.amazonaws.services.ec2.model.Tag;
import com.amazonaws.services.ec2.model.TerminateInstancesRequest;
...
private static List<Instance> getRunningInstances(AmazonEC2Client ec2, List<String> instanceIds) {
    List<Instance> runningInstances = new ArrayList<>();
    try {
        DescribeInstancesRequest request = new DescribeInstancesRequest()
                .withInstanceIds(instanceIds);
        DescribeInstancesResult result;
        do {
            // DescribeInstancesResponse is a paginated response, so use tokens with multiple requests.
            result = ec2.describeInstances(request);
            request.setNextToken(result.getNextToken());   // Prepare request for next page.
            for (final Reservation r : result.getReservations()) {
                for (final Instance instance : r.getInstances()) {
                    LOGGER.info("Examining instanceId: "+ instance.getInstanceId());
                    // if instance is in a running state, add it to runningInstances list.
                    if (RUNNING_STATES.contains(instance.getState().getName())) {
                        runningInstances.add(instance);
                    }
                }
            }
        } while (result.getNextToken() != null);
    } catch (final AmazonEC2Exception exception) {
        // if instance isn't found, assume its terminated and continue.
        if (exception.getErrorCode().equals(NOT_FOUND_ERROR_CODE)) {
            LOGGER.info("Instance probably terminated; moving on.");
        } else {
            throw exception;
        }
    }
    return runningInstances;
}
```

### 1. 添加 v2 Maven BOM
<a name="migration-steps-example-step1"></a>

将适用于 Java 的 SDK 2.x 的 Maven BOM 添加到 POM 的 `dependencyManagement` 部分，与任何其他依赖项放在一起。如果您的 POM 文件中有 SDK v1 的 BOM，请暂时将其保留。您将在后面的步骤中将其删除。

#### 在一开始就配置好 POM 依赖项管理
<a name="migration-example-boms"></a>

```
<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.example</groupId>             <!--Existing dependency in POM. -->
      <artifactId>bom</artifactId>
      <version>1.3.4</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
    ...
    <dependency>
      <groupId>com.amazonaws</groupId>
      <artifactId>aws-java-sdk-bom</artifactId>  <!--Existing v1 BOM dependency. -->
      <version>1.11.1000</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
    ...
    <dependency>
      <groupId>software.amazon.awssdk</groupId>  <!--Add v2 BOM dependency. -->
      <artifactId>bom</artifactId>
      <version>{{2.27.21}}</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>
```

### 2. 在文件中搜索 v1 类导入语句
<a name="migration-steps-example-step2"></a>

在应用程序的代码中搜索唯一出现的 `import com.amazonaws.services`。这有助于我们确定项目使用的 v1 依赖项。如果您的应用程序有一个 Maven POM 文件列出了 v1 依赖项，则可以改用此信息。

在这个例子中，我们使用 [`ripgrep` (rg)](https://github.com/BurntSushi/ripgrep) 命令来搜索代码库。

在代码库的根目录中执行以下 `ripgrep` 命令。`ripgrep`找到导入语句后，将它们通过管道传送到`cut``sort`、和`uniq`命令以隔离 S IDs ERVICE\_。

```
rg --no-filename 'import\s+com\.amazonaws\.services' | cut -d '.' -f 4 | sort | uniq
```

对于此应用程序，将以下 SERVICE\_ IDs 记录到控制台。

```
autoscaling
cloudformation
ec2
identitymanagement
```

这表明 `import` 语句中使用的以下每个软件包名称至少出现一次。就我们当前的目的而言，具体的类名无关紧要。我们只需要找到使用的 SERVICE\_ IDs 即可。

```
com.amazonaws.services.autoscaling.*
com.amazonaws.services.cloudformation.*
com.amazonaws.services.ec2.*
com.amazonaws.services.identitymanagement.*
```

### 3. 从 v1 导入语句中确定 v2 Maven 依赖项
<a name="migration-steps-example-step3"></a>

我们从步骤 2 中分离IDs 出来的 v1 的 SERVICE\_（例如`autoscaling`和`cloudformation`）在大多数情况下可以映射到相同的 v2 SERVICE\_ID。由于 v2 Maven artifactId 在大多数情况下都与 SERVICE\_ID 匹配，因此您已拥有所需的信息，可以向 POM 文件添加依赖项块。

下表说明了我们如何确定 v2 依赖项。


| v1 SERVICE\_ID 映射到 ...软件包名称 | v2 SERVICE\_ID 映射到 ...软件包名称 | v2 Maven 依赖项 | 
| --- | --- | --- | 
| **ec2**<br />`com.amazonaws.services.ec2.*` | **ec2**<br />`software.amazon.awssdk.services.ec2.*` |  <pre><dependency><br />  <groupId>software.amazon.awssdk</groupId><br />  <artifactId>ec2</artifactId><br /></dependency></pre>  | 
| **自动缩放**<br />`com.amazonaws.services.autoscaling.*` | **自动缩放**<br />`software.amazon.awssdk.services.autoscaling.*` |  <pre><dependency><br />  <groupId>software.amazon.awssdk</groupId><br />  <artifactId>autoscaling</artifactId><br /></dependency></pre>  | 
| cloudformation`com.amazonaws.services.cloudformation.*` | cloudformation`software.amazon.awssdk.cloudformation.*` |  <pre><dependency><br />  <groupId>software.amazon.awssdk</groupId><br />  <artifactId>cloudformation</artifactId><br /></dependency></pre>  | 
| identitymanagement\*`com.amazonaws.services.identitymanagement.*` | 我\*`software.amazon.awssdk.iam.*` |  <pre><dependency><br />  <groupId>software.amazon.awssdk</groupId><br />  <artifactId>iam</artifactId><br /></dependency></pre>  | 

\* `identitymanagement` 到 `iam` 映射是一个例外，不同版本的 SERVICE\_ID 有所不同。如果 Maven 或 Gradle 无法解析 v2 依赖项，请参阅[软件包名称到 Maven artifactId 的映射](#migration-serviceid-artifactid-mapping)以了解例外情况。

### 4. 将 v2 依赖项元素添加到 POM 文件中
<a name="migration-steps-example-step4"></a>

在步骤 3 中，我们确定了需要添加到 POM 文件中的四个依赖项块。因为我们在步骤 1 中指定了 BOM，我们不需要添加版本。添加导入后，我们的 POM 文件具有以下依赖项元素。

```
    ...
  <dependencies>
    ...
    <dependency>
      <groupId>software.amazon.awssdk</groupId>
      <artifactId>autoscaling</artifactId>
    </dependency>
    <dependency>
      <groupId>software.amazon.awssdk</groupId>
      <artifactId>iam</artifactId>
    </dependency>
    <dependency>
      <groupId>software.amazon.awssdk</groupId>
      <artifactId>cloudformation</artifactId>
    </dependency>
    <dependency>
      <groupId>software.amazon.awssdk</groupId>
      <artifactId>ec2</artifactId>
    </dependency>
    ...
  </dependencies>
    ...
```

### 5. 在 Java 文件中，逐渐将 v1 类更改为 v2 类
<a name="migration-steps-example-step5"></a>

在我们正在迁移的方法中，我们看到
+ 来自 `com.amazonaws.services.ec2.AmazonEC2Client` 的 EC2 服务客户端。
+ 使用了几个 EC2 模型类。例如，`DescribeInstancesRequest` 和 `DescribeInstancesResult`。

```
import com.amazonaws.ClientConfiguration;
import com.amazonaws.regions.Region;
import com.amazonaws.regions.RegionUtils;
import com.amazonaws.services.ec2.AmazonEC2Client;
import com.amazonaws.services.ec2.model.AmazonEC2Exception;
import com.amazonaws.services.ec2.model.CreateTagsRequest;
import com.amazonaws.services.ec2.model.DescribeInstancesRequest;
import com.amazonaws.services.ec2.model.DescribeInstancesResult;
import com.amazonaws.services.ec2.model.Instance;
import com.amazonaws.services.ec2.model.InstanceStateName;
import com.amazonaws.services.ec2.model.Reservation;
import com.amazonaws.services.ec2.model.Tag;
import com.amazonaws.services.ec2.model.TerminateInstancesRequest;
...
private static List<Instance> getRunningInstances(AmazonEC2Client ec2, List<String> instanceIds)
    List<Instance> runningInstances = new ArrayList<>();
    try {
        DescribeInstancesRequest request = new DescribeInstancesRequest()
                .withInstanceIds(instanceIds);
        DescribeInstancesResult result;
        do {
            // DescribeInstancesResponse is a paginated response, so use tokens with multiple re
            result = ec2.describeInstances(request);
            request.setNextToken(result.getNextToken());   // Prepare request for next page.
            for (final Reservation r : result.getReservations()) {
                for (final Instance instance : r.getInstances()) {
                    LOGGER.info("Examining instanceId: "+ instance.getInstanceId());
                    // if instance is in a running state, add it to runningInstances list.
                    if (RUNNING_STATES.contains(instance.getState().getName())) {
                        runningInstances.add(instance);
                    }
                }
            }
        } while (result.getNextToken() != null);
    } catch (final AmazonEC2Exception exception) {
        // if instance isn't found, assume its terminated and continue.
        if (exception.getErrorCode().equals(NOT_FOUND_ERROR_CODE)) {
            LOGGER.info("Instance probably terminated; moving on.");
        } else {
            throw exception;
        }
    }
    return runningInstances;
}
...
```

我们的目标是用 v2 导入替换所有 v1 导入。我们一次只处理一个类。

#### a. 替换导入语句或类名称
<a name="migration-example-step5-substep1"></a>

我们看到 `describeRunningInstances` 方法的第一个参数是 v1 `AmazonEC2Client` 实例。请执行以下操作之一：
+ 将 `com.amazonaws.services.ec2.AmazonEC2Client` 的导入替换为 `software.amazon.awssdk.services.ec2.Ec2Client`，然后将 `AmazonEC2Client` 更改为 `Ec2Client`。
+ 将参数类型更改为 `Ec2Client`，然后让 IDE 为我们提示正确的导入。由于客户端名称不同（`AmazonEC2Client` 和 `Ec2Client`），我们的 IDE 会提示我们导入 v2 类。如果两个版本中的类名称相同，则此方法不起作用。

#### b. 将 v1 模型类替换为 v2 等效项
<a name="migration-example-step5-substep2"></a>

在对 v2 `Ec2Client` 进行更改之后，如果我们使用 IDE，则会在以下语句中看到编译错误。

```
                    result = ec2.describeInstances(request);
```

编译错误是由于使用 v1 的 `DescribeInstancesRequest` 实例作为 v2 `Ec2Client` `describeInstances` 方法的参数所致。要修复此问题，请使用以下替换或导入语句。


| 替换 | 用 | 
| --- | --- | 
|  <pre>import com.amazonaws.services.ec2.model.DescribeInstancesRequest</pre>  |  <pre>import software.amazon.awssdk.services.ec2.model.DescribeInstancesRequest</pre>  | 

#### c. 将 v1 构造函数更改为 v2 生成器。
<a name="migration-example-step5-substep3"></a>

因为 [v2 类中没有构造函数](migration-whats-different.md#immutable-classes)，我们仍然会看到编译错误。要修复此问题，进行以下更改。


| 更改 | 修改为 | 
| --- | --- | 
|  <pre>final DescribeInstancesRequest request = new DescribeInstancesRequest()<br />        .withInstanceIds(instanceIdsCopy);</pre>  |  <pre>final DescribeInstancesRequest request = DescribeInstancesRequest.builder()<br />        .instanceIds(instanceIdsCopy)<br />        .build();</pre>  | 

#### d. 将 v1 `*Result` 响应对象替换为 v2 `*Response` 等效项
<a name="migration-example-step5-substep4"></a>

v1 和 v2 之间一个始终一致的区别是：[v2 中的所有响应对象都以 `*Response` 而不是以 `*Result` 结尾](migration-whats-different.md#model-classname-changes)。将 v1 `DescribeInstancesResult` 导入替换为 v2 导入 `DescribeInstancesResponse`。

#### d. 进行 API 更改
<a name="migration-example-step5-substep5"></a>

以下语句需要进行一些更改。

```
request.setNextToken(result.getNextToken());
```

在 v2 中，[setter 方法](migration-whats-different.md#setter-getter-methods)不使用 `set` `prefix`。在适用于 Java 的 SDK 2.x 中，getter 方法也不再使用 `get` 前缀

模型类（例如 `request` 实例）在 v2 中是不可变的，因此我们需要使用生成器创建一个新的 `DescribeInstancesRequest`。

在 v2 中，该语句变成了下面这样。

```
request = DescribeInstancesRequest.builder()
        .nextToken(result.nextToken())
        .build();
```

#### d. 重复直到方法能够使用 v2 类成功编译
<a name="migration-example-step5-substep6"></a>

继续执行代码的其余部分。用 v2 导入替换 v1 导入并修复编译错误。如有必要，请参阅 [v2 API 参考](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/ec2/package-summary.html)和[主要变更](migration-whats-different.md)。

在我们迁移这一个方法之后，我们有了以下 v2 代码。

```
import com.amazonaws.ClientConfiguration;
import com.amazonaws.regions.Region;
import com.amazonaws.regions.RegionUtils;
import com.amazonaws.services.ec2.AmazonEC2Client;
import com.amazonaws.services.ec2.model.AmazonEC2Exception;
import com.amazonaws.services.ec2.model.CreateTagsRequest;
import com.amazonaws.services.ec2.model.InstanceStateName;
import com.amazonaws.services.ec2.model.Tag;
import com.amazonaws.services.ec2.model.TerminateInstancesRequest;

import software.amazon.awssdk.services.ec2.Ec2Client;
import software.amazon.awssdk.services.ec2.model.DescribeInstancesRequest;
import software.amazon.awssdk.services.ec2.model.DescribeInstancesResponse;
import software.amazon.awssdk.services.ec2.model.Ec2Exception;
import software.amazon.awssdk.services.ec2.model.Instance;
import software.amazon.awssdk.services.ec2.model.Reservation;
...
private static List<Instance> getRunningInstances(Ec2Client ec2, List<String> instanceIds) {
    List<Instance> runningInstances = new ArrayList<>();
        try {
            DescribeInstancesRequest request = DescribeInstancesRequest.builder()
                    .instanceIds(instanceIds)
                    .build();
            DescribeInstancesResponse result;
            do {
                // DescribeInstancesResponse is a paginated response, so use tokens with multiple re
                result = ec2.describeInstances(request);
                request = DescribeInstancesRequest.builder()   // Prepare request for next page.
                        .nextToken(result.nextToken())
                        .build();
                for (final Reservation r : result.reservations()) {
                    for (final Instance instance : r.instances()) {
                        // if instance is in a running state, add it to runningInstances list.
                        if (RUNNING_STATES.contains(instance.state().nameAsString())) {
                            runningInstances.add(instance);
                        }
                    }
                }
            } while (result.nextToken() != null);
        } catch (final Ec2Exception exception) {
            // if instance isn't found, assume its terminated and continue.
            if (exception.awsErrorDetails().errorCode().equals(NOT_FOUND_ERROR_CODE)) {
                    LOGGER.info("Instance probably terminated; moving on.");
            } else {
                throw exception;
            }
        }
        return runningInstances;
    }
...
```

由于我们正在对一个包含八个方法的 Java 文件中的单个方法进行迁移，因此在处理该文件期间会同时存在 v1 和 v2 版本的导入语句。我们在执行这些步骤时添加了最后六个导入语句。

在我们迁移所有代码之后，将不再有 v1 导入语句。

### 6. 从 POM 中移除 v1 Maven 依赖项，从文件中移除 v1 导入
<a name="migration-steps-example-step6"></a>

迁移文件中的所有 v1 代码后，我们有以下 v2 SDK 导入语句。

```
import software.amazon.awssdk.core.client.config.ClientOverrideConfiguration;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.regions.ServiceMetadata;
import software.amazon.awssdk.services.ec2.Ec2Client;
import software.amazon.awssdk.services.ec2.model.CreateTagsRequest;
import software.amazon.awssdk.services.ec2.model.DescribeInstancesRequest;
import software.amazon.awssdk.services.ec2.model.DescribeInstancesResponse;
import software.amazon.awssdk.services.ec2.model.Ec2Exception;
import software.amazon.awssdk.services.ec2.model.Instance;
import software.amazon.awssdk.services.ec2.model.InstanceStateName;
import software.amazon.awssdk.services.ec2.model.Reservation;
import software.amazon.awssdk.services.ec2.model.Tag;
import software.amazon.awssdk.services.ec2.model.TerminateInstancesRequest;
```

在我们迁移应用程序中的*所有*文件后，我们不再需要 POM 文件中的 v1 依赖项。从 `dependencyManagement` 部分移除 v1 BOM（如果已使用）以及所有 v1 依赖项块。

### 7. 重构代码以使用 v2 API 增强功能
<a name="migration-steps-example-step7"></a>

对于我们一直在迁移的代码段，我们可以选择使用 v2 分页器，让 SDK 管理基于令牌的请求，以获得更多数据。

我们可以将整个 `do` 子句替换为以下内容。

```
                DescribeInstancesIterable responses = ec2.describeInstancesPaginator(request);

                responses.reservations().stream()
                        .forEach(reservation -> reservation.instances()
                                .forEach(instance -> {
                                    if (RUNNING_STATES.contains(instance.state().nameAsString())) {
                                        runningInstances.put(instance.instanceId(), instance);
                                    }
                                }));
```

## 软件包名称到 Maven artifactId 的映射
<a name="migration-serviceid-artifactid-mapping"></a>

当您将 Maven 或 Gradle 项目从适用于 Java 的 SDK v1 迁移到 v2 时，您需要弄清楚要将哪些依赖项添加到构建文件中。[带示例的迁移 step-by-step说明](#migration-steps)（步骤 3）中描述的方法使用导入语句中的软件包名称作为起点来确定要添加到构建文件中的依赖项（如 artifactId）。

您可以使用本主题中的信息将 v1 软件包名称映射到 v2 artifactId。

### 软件包名称和 Maven artifactId 中使用的常见命名约定
<a name="migration-naming-convention"></a>

下表显示了给定 SERVICE\_ID SDKs 使用的常见命名约定。SERVICE\_ID 是的唯一标识符。 AWS 服务例如，Amazon S3 服务的 SERVICE\_ID 是 `s3`，Amazon Cognito Identity 的 SERVICE\_ID 是 `cognitoidentity`。


<table>
<thead>
  <tr><th>v1 软件包名称（导入语句）</th><th>v1 artifactId</th><th>v2 artifactId</th><th>v2 软件包名称（导入语句）</th></tr>
</thead>
<tbody>
  <tr><td>com.amazonaws.services.SERVICE\_ID</td><td>aws-java-sdk-服务 ID</td><td>SERVICE\_ID</td><td>software.amazon.awssdk.services.SERVICE\_ID</td></tr>
  <tr><td colspan="4"> </td></tr>
  <tr><td colspan="4">Amazon Cognito Identity 的示例（SERVICE\_ID：cognitoidentity）</td></tr>
  <tr><td>com.amazonaws.services.cognitoidentity</td><td>aws-java-sdk-认知身份</td><td>cognitoidentity</td><td>software.amazon.awssdk.services.cognitoidentity</td></tr>
</tbody>
</table>


### SERVICE\_ID 差异
<a name="migration-serviceid-diffs"></a>

#### 在 v1 中
<a name="migration-serviceid-diffs-withinv1"></a>

在某些情况下，同一服务的 SERVICE\_ID 在软件包名称和 artifactId 中有所不同。例如，下表的 “ CloudWatch 指标” 行显示包名中是 SERVICE\_ID，但却`metrics``cloudwatchmetrics`是 ArtifactID 的 SERVICE\_ID。

#### 在 v2 中
<a name="migration-serviceid-diffs-withinv2"></a>

软件包名称和 artifactId 中使用的 SERVICE\_ID 没有差异。

#### v1 和 v2 之间
<a name="migration-serviceid-diffs-btwv1v2"></a>

对于大多数服务，v2 中的 SERVICE\_ID 与 v1 在软件包名称和 artifactId 中的 SERVICE\_ID 相同。这方面的一个例子是 `cognitoedentity` SERVICE\_ID，如上表所示。但是，有些 SERVICE\_ IDs 有所不同 SDKs，如下表所示。

任一个 v1 列中的**粗体 SERVICE\_ID** 表示它与 v2 中使用的 SERVICE\_ID 不同。


<table>
<thead>
  <tr><th>服务名称</th><th>v1 软件包名称</th><th>v1 artifactId</th><th>v2 artifactId</th><th>v2 软件包名称</th></tr>
</thead>
<tbody>
  <tr><td></td><td>所有软件包名称都以 `com.amazonaws.services` 开头，如第一行所示。</td><td>所有 artifactId 都包含在标签中，如第一行所示。</td><td>所有 artifactId 都包含在标签中，如第一行所示。</td><td>所有软件包名称都以 `software.amazon.awssdk` 开头，如第一行所示。</td></tr>
  <tr><td colspan="5"></td></tr>
  <tr><td>API Gateway</td><td>com.amazonaws.services.apigateway</td><td><artifactId>aws-java-sdk-api 网关</artifactId></td><td><artifactId>apigateway</artifactId></td><td>software.amazon.awssdk.services.apigateway</td></tr>
  <tr><td>App Registry</td><td>appregistry</td><td>appregistry</td><td>servicecatalogappregistry</td><td>servicecatalogappregistry</td></tr>
  <tr><td>Application Discovery</td><td>applicationdiscovery</td><td>discovery</td><td>applicationdiscovery</td><td>applicationdiscovery</td></tr>
  <tr><td>Augmented AI Runtime</td><td>augmentedairuntime</td><td>augmentedairuntime</td><td>sagemakera2iruntime</td><td>sagemakera2iruntime</td></tr>
  <tr><td>Certificate Manager</td><td>certificatemanager</td><td>acm</td><td>acm</td><td>acm</td></tr>
  <tr><td>CloudControl API</td><td>cloudcontrolapi</td><td>cloudcontrolapi</td><td>cloudcontrol</td><td>cloudcontrol</td></tr>
  <tr><td>CloudSearch</td><td>cloudsearchv2</td><td>cloudsearch</td><td>cloudsearch</td><td>cloudsearch</td></tr>
  <tr><td>CloudSearch 域</td><td>cloudsearchdomain</td><td>云端搜索</td><td>cloudsearchdomain</td><td>cloudsearchdomain</td></tr>
  <tr><td>CloudWatch 活动</td><td>cloudwatchevents</td><td>事件</td><td>cloudwatchevents</td><td>cloudwatchevents</td></tr>
  <tr><td>CloudWatch 显然</td><td>cloudwatchevidently</td><td>cloudwatchevidently</td><td>evidently</td><td>evidently</td></tr>
  <tr><td>CloudWatch 日志</td><td>logs</td><td>logs</td><td>cloudwatchlogs</td><td>cloudwatchlogs</td></tr>
  <tr><td>CloudWatch 指标</td><td>metrics</td><td>cloudwatchmetrics</td><td>cloudwatch</td><td>cloudwatch</td></tr>
  <tr><td>CloudWatch 朗姆酒</td><td>cloudwatchrum</td><td>cloudwatchrum</td><td>rum</td><td>rum</td></tr>
  <tr><td>Cognito Identity Provider</td><td>cognitoidp</td><td>cognitoidp</td><td>cognitoidentityprovider</td><td>cognitoidentityprovider</td></tr>
  <tr><td>Connect Campaign</td><td>connectcampaign</td><td>connectcampaign</td><td>connectcampaigns</td><td>connectcampaigns</td></tr>
  <tr><td>Connect Wisdom</td><td>connectwisdom</td><td>connectwisdom</td><td>wisdom</td><td>wisdom</td></tr>
  <tr><td>Database Migration Service</td><td>databasemigrationservice</td><td>dms</td><td>databasemigration</td><td>databasemigration</td></tr>
  <tr><td>DataZone</td><td>datazone</td><td>datazoneexternal</td><td>datazone</td><td>datazone</td></tr>
  <tr><td>DynamoDB</td><td>dynamodbv2</td><td>dynamodb</td><td>dynamodb</td><td>dynamodb</td></tr>
  <tr><td>Elastic File System</td><td>弹性文件系统</td><td>efs</td><td>efs</td><td>efs</td></tr>
  <tr><td>Elastic Map Reduce</td><td>elasticmapreduce</td><td>emr</td><td>emr</td><td>emr</td></tr>
  <tr><td>Glue DataBrew</td><td>gluedatabrew</td><td>gluedatabrew</td><td>databrew</td><td>databrew</td></tr>
  <tr><td>IAM Roles Anywhere</td><td>iamrolesanywhere</td><td>iamrolesanywhere</td><td>rolesanywhere</td><td>rolesanywhere</td></tr>
  <tr><td>身份管理</td><td>identitymanagement</td><td>IAM</td><td>IAM</td><td>IAM</td></tr>
  <tr><td>IoT Data</td><td>iotdata</td><td>iot</td><td>iotdataplane</td><td>iotdataplane</td></tr>
  <tr><td>Kinesis Analytics</td><td>kinesisanalytics</td><td>kinesis</td><td>kinesisanalytics</td><td>kinesisanalytics</td></tr>
  <tr><td>Kinesis Firehose</td><td>kinesisfirehose</td><td>kinesis</td><td>Firehose</td><td>Firehose</td></tr>
  <tr><td>Kinesis Video Signaling Channels</td><td>kinesisvideosignalingchannels</td><td>kinesisvideosignalingchannels</td><td>kinesisvideosignaling</td><td>kinesisvideosignaling</td></tr>
  <tr><td>Lex</td><td>lexruntime</td><td>lex</td><td>lexruntime</td><td>lexruntime</td></tr>
  <tr><td>Lookout For Vision</td><td>lookoutforvision</td><td>lookoutforvision</td><td>lookoutvision</td><td>lookoutvision</td></tr>
  <tr><td>Mainframe Modernization</td><td>mainframemodernization</td><td>mainframemodernization</td><td>m2</td><td>m2</td></tr>
  <tr><td>Marketplace Metering</td><td>marketplacemetering</td><td>marketplacemeteringservice</td><td>marketplacemetering</td><td>marketplacemetering</td></tr>
  <tr><td>Managed Grafana</td><td>managedgrafana</td><td>managedgrafana</td><td>grafana</td><td>grafana</td></tr>
  <tr><td>Mechanical Turk</td><td>mturk</td><td>mechanicalturkrequester</td><td>mturk</td><td>mturk</td></tr>
  <tr><td>Migration Hub Strategy Recommendations</td><td>migrationhubstrategyrecommendations</td><td>migrationhubstrategyrecommendations</td><td>migrationhubstrategy</td><td>migrationhubstrategy</td></tr>
  <tr><td>Nimble Studio</td><td>nimblestudio</td><td>nimblestudio</td><td>nimble</td><td>nimble</td></tr>
  <tr><td>Private 5G</td><td>private5g</td><td>private5g</td><td>privatenetworks</td><td>privatenetworks</td></tr>
  <tr><td>Prometheus</td><td>prometheus</td><td>prometheus</td><td>amp</td><td>amp</td></tr>
  <tr><td>Recycle Bin</td><td>recyclebin</td><td>recyclebin</td><td>rbin</td><td>rbin</td></tr>
  <tr><td>Redshift 数据 API</td><td>redshiftdataapi</td><td>redshiftdataapi</td><td>redshiftdata</td><td>redshiftdata</td></tr>
  <tr><td>Route 53</td><td>route53domains</td><td>route53</td><td>route53domains</td><td>route53domains</td></tr>
  <tr><td>Sage Maker Edge Manager</td><td>sagemakeredgemanager</td><td>sagemakeredgemanager</td><td>sagemakeredge</td><td>sagemakeredge</td></tr>
  <tr><td>Security Token</td><td>securitytoken</td><td>sts</td><td>sts</td><td>sts</td></tr>
  <tr><td>Server Migration</td><td>servermigration</td><td>servermigration</td><td>sms</td><td>sms</td></tr>
  <tr><td>Simple Email</td><td>simpleemail</td><td>ses</td><td>ses</td><td>ses</td></tr>
  <tr><td>Simple Email V2</td><td>simpleemailv2</td><td>sesv2</td><td>sesv2</td><td>sesv2</td></tr>
  <tr><td>Simple Systems Management</td><td>simplesystemsmanagement</td><td>ssm</td><td>ssm</td><td>ssm</td></tr>
  <tr><td>Simple Workflow</td><td>simpleworkflow</td><td>simpleworkflow</td><td>swf</td><td>swf</td></tr>
  <tr><td>Step Functions</td><td>stepfunctions</td><td>stepfunctions</td><td>sfn</td><td>sfn</td></tr>
</tbody>
</table>
