

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

# 使用 适用于 Java 的 AWS SDK 1.x 客户端查找应用程序
<a name="migration-find-apps-using-v1"></a>

在迁移到之前 AWS SDK for Java 2.x，您需要确定您的环境中哪些应用程序使用 SDK for Java 1.x 客户端。您可以使用 CloudTrail 日志来跟踪 SDK 的使用情况，在应用程序日志中搜索弃用警告，检查源代码和编译配置，或者检查可部署的 Java 构件。使用环境中可用的任何方法。

## 使用 CloudTrail Lake 查找具有 1.x 客户端的应用程序
<a name="migration-find-v1-apps-with-cloudtrail"></a>

AWS CloudTrail Lake 允许您查询由记录的事件 CloudTrail。按照以下步骤来创建数据湖，用于识别应用程序使用的 SDK 版本：

1. 创建 CloudTrail 数据湖。要创建事件数据存储，请参阅[用户指南](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/query-event-data-store.html)。

1. 创建数据存储后，检查记录内容。记录正文包含用于确定请求的操作、计时和位置的字段。有关详细信息，请参阅[用户指南以获取 CloudTrail 录制内容](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-event-reference-record-contents.html)。

1. 对您的数据运行查询。按照[用户指南来查询和保存查询结果](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/query-run-query.html)。

每条记录中的 *userAgent* 字段包含发出请求的 SDK 版本。使用此字段来识别使用适用于 Java 的 SDK 1.x 的应用程序。

以下示例查询将查找从 2025 年 6 月 17 日起，用户应用程序和第三方工具使用 SDK for Java 1.x 发出的所有 EventDatastore ID `sample-Data-Store-Id` 请求：

```
select userIdentity, eventSource, awsRegion,
    eventName, eventType, eventTime, userAgent,
    requestParameters, sourceIPAddress
 from sample-Data-Store-Id
where eventTime > '2025-06-17 00:00:00'
and userAgent like '%aws-sdk-java/1.%'
and userAgent not like '%aws-internal/%'
order by eventTime desc
```

查询结果中的事件内容类似于以下示例：

```
{
    "userIdentity": "{
         "type": "IAMUser",
         "principalId": "AIDAJ45Q7YFFAREXAMPLE",
         "arn": "arn:aws:iam::123456789012:user/Alice",
         "accountId": "123456789012",
         "accessKeyId": "",
         "userName": "Alice"
    }",
    "eventSource": "dynamodb.amazonaws.com",
    "awsRegion": "us-west-2",
    "eventName": "ListTables",
    "eventType": "AwsApiCall",
    "eventTime": "2025-07-01 02:23:52.000",
    "userAgent": "aws-sdk-java/1.12.746 Linux/5.10.240 OpenJDK/11.0.25+9-LTS ...",
    "requestParameters": "",
    "sourceIPAddress": "12.345.6.78"
}
```

您可以使用此信息来帮助确定何时何地发出请求。

在示例中，使用名为 Alice 的 IAM 用户的凭证，在 `2025-07-01 02:23:52 (UTC)` 从 IP 地址 `12.345.6.78` 发出 DynamoDB `ListTables` 请求。*userAgent* 字段的值显示请求是使用装有 JDK 11 `1.12.746` 的 Linux 系统的 适用于 Java 的 AWS SDK 版本发出的。

有关 AWS CloudTrail 事件记录中各字段的描述，[请参阅管理、数据和网络活动事件的CloudTrail 记录内容](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-event-reference-record-contents.html)。

 CloudTrail 如果您的账户中未启用，请联系贵组织的 AWS 账户管理员将其启用，或者使用以下各节中描述的替代方法之一。

CloudTrail Lake 会对每次查询摄取的数据和扫描的数据收费。为了最大限度地降低成本，请将查询筛选到特定的时间范围和区域。有关当前定价，请参阅 [AWS CloudTrail 定价](https://aws.amazon.com/cloudtrail/pricing/)。

## 在应用程序警告级别的日志中搜索 SDK 的弃用
<a name="migration-find-v1-apps-log-warning"></a>

从 1.12.767 版本（2024 年 7 月 30 日发布）开始， 适用于 Java 的 AWS SDK 1.x 会在应用程序启动时发出弃用警告。您可以在应用程序日志中搜索此警告，以确定哪些应用程序和主机正在使用 SDK for Java 1.x。

警告的确切措辞取决于 SDK 版本：
+ 版本 1.12.767 到 1.12.796：

  `WARNING: The AWS SDK for Java 1.x entered maintenance mode starting July 31, 2024 and will reach end of support on December 31, 2025...`
+ 版本 1.12.797 及更高版本：

  `WARNING: The AWS SDK for Java 1.x reached end of support on December 31, 2025...`

尾部`...`表示警告消息继续显示其他文本。您可以搜索常用前缀`The AWS SDK for Java 1.x`来查找警告的任一版本。

以下示例演示如何使用以下方法搜索此警告`grep`：

```
grep -r "The AWS SDK for Java 1.x" /path/to/your/application/logs/
```

如果找到警告，该`grep`命令将打印匹配的日志行。如果未找到警告，则可能是您的应用程序未使用适用于 Java 1.x 的 SDK，或者它使用的是低于 1.12.767 的版本。在这种情况下，请使用本文档中描述的其他方法之一。

## 搜索源代码和依赖关系
<a name="migration-find-v1-apps-source-code"></a>

您可以在代码库和构建配置文件中搜索对 适用于 Java 的 AWS SDK 1.x 的引用。密钥标识符是`com.amazonaws`群组 ID，所有 SDK for Java 1.x 工件都使用该标识。

以下示例演示了`grep`如何使用在常用 Java 项目文件中搜索`com.amazonaws`引用。

**示例：在 Java 源文件中搜索适用于 Java 的 SDK 1.x 导入（从项目根目录运行）**

```
grep -r "import com.amazonaws" --include="*.java" .
```

输出示例：

```
src/main/java/com/example/App.java:import com.amazonaws.services.s3.AmazonS3;
```

**注意**  
不属于适用于 Java SDK 1.x 的库也使用该软件包，例如`aws-lambda-java-core`。`com.amazonaws`要确认导入源自 SDK for Java 1.x，请检查您的`pom.xml``build.gradle`、或依赖项管理配置中相应的工件 ID 是否以`aws-java-sdk-`开头。

**示例：在 Maven `pom.xml` 文件中搜索适用于 Java 的 SDK 1.x 依赖项（从项目根目录运行）**

```
grep -r "com.amazonaws" --include="pom.xml" .
```

输出示例：

```
pom.xml:    <groupId>com.amazonaws</groupId>
```

**示例：在 Gradle 构建文件中搜索 SDK for Java 1.x 依赖项（从项目根目录运行）**

```
grep -r "com.amazonaws:aws-java-sdk" --include="*.gradle" .
```

输出示例：

```
build.gradle:    implementation 'com.amazonaws:aws-java-sdk-s3:1.12.xxx'
```

前面的`grep`命令标识了直接在源文件和编译文件中声明的 SDK for Java 1.x 引用。但是，您的应用程序也可能通过本身依赖于 SDK 的 SDK for Java 1.x，即通过本身依赖于 SDK 的第三方库。使用构建工具的依赖关系树查找适用于 Java 1.x 的 SDK 的直接依赖关系和传递依赖关系。选择与您的编译系统相匹配的示例。

**示例：使用 Maven 查找所有适用于 Java 的 SDK 1.x 依赖项（从项目根目录运行）**

```
mvn dependency:tree -Dincludes=com.amazonaws
```

输出示例：

```
[INFO] com.example:my-application:jar:1.0-SNAPSHOT
[INFO] +- com.amazonaws:aws-java-sdk-s3:jar:1.12.746:compile
[INFO] |  \- com.amazonaws:aws-java-sdk-core:jar:1.12.746:compile
[INFO] \- some.thirdparty:library:jar:2.3.1:compile
[INFO]    \- com.amazonaws:aws-java-sdk-dynamodb:jar:1.12.600:compile
```

该`-Dincludes=com.amazonaws`标志会筛选树以仅显示适用于 Java 的 SDK 1.x 构件。在此示例中，`aws-java-sdk-s3`是直接依赖关系，但`aws-java-sdk-dynamodb`它是由`some.thirdparty:library`引入的传递依赖关系。

**示例：使用 Gradle 查找所有适用于 Java 的 SDK 1.x 依赖项（从项目根目录运行）**

```
gradle dependencies --configuration runtimeClasspath | grep "com.amazonaws"
```

输出示例：

```
+--- com.amazonaws:aws-java-sdk-s3:1.12.746
|    \--- com.amazonaws:aws-java-sdk-core:1.12.746
\--- com.amazonaws:aws-java-sdk-dynamodb:1.12.600
```

Gradle 没有与 Maven 相当的内置依赖过滤器`-Dincludes`，因此管道传递`grep`是最简单的方法。

## 检查可部署的 Java 工件
<a name="migration-find-v1-apps-inspect-artifacts"></a>

您可以检查可部署的 Java 工件（JARs WARs、或 EARs），以确认 适用于 Java 的 AWS SDK 1.x 是否与您的应用程序打包在一起。Java 存档文件是 ZIP 格式的文件。要确定是否存在适用于 Java 的 SDK 1.x，请在存档`com/amazonaws/sdk/versionInfo.properties`中查找该文件。此文件包含在`aws-java-sdk-core`模块中，并包含 SDK 版本号。

### 使用`jar`命令快速检查
<a name="migration-find-v1-apps-jar-command"></a>

对于所有依赖类都在顶层合并的 uber-jar，请列出存档内容并搜索版本文件：

在以下示例中，`myapp.jar`替换为应用程序的 JAR 文件的路径。

```
jar -tf myapp.jar | grep 'versionInfo.properties'
```

如果有 SDK，则输出为：

```
com/amazonaws/sdk/versionInfo.properties
```

如果该`jar`命令在您的环境中不可用（例如，仅限 JRE 或最小容器镜像），则可以改用`unzip -l`：

```
unzip -l myapp.jar | grep 'versionInfo.properties'
```

要打印版本，请执行以下操作：

```
unzip -p myapp.jar com/amazonaws/sdk/versionInfo.properties
```

输出示例：

```
platform=java
version=1.12.xxx
```

**注意**  
前面的命令仅搜索 uber-jar 中的顶级条目。他们不会在精简 JARs （其中依赖项是外部依赖项）或嵌套内部 JARs （例如 WARs EARs、中的那些或`lib/`或`WEB-INF/lib/`下的 Lambda 包）中找不到 SDK 类。对于精简 JARs版，请改为检查您的编译配置 (`pom.xml`,`build.gradle`) 或依赖关系树。对于嵌套 JARs，请 JARs 使用一种无需解压缩到磁盘即可递归读取 ZIP 存档的工具搜索捆绑包。