

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

# Ferramenta de migração do AWS SDK para Java
<a name="migration-tool"></a>

O AWS SDK para Java fornece uma ferramenta de migração que ajuda a automatizar a migração do código do SDK para Java 1.x (V1) para 2.x (V2). A ferramenta usa o [OpenRewrite](https://docs.openrewrite.org/), uma ferramenta de refatoração de código-fonte e código aberto, para fazer a migração. O OpenRewrite usa regras de modificação de código (chamadas de “receitas”) para atualizar automaticamente o código-fonte da sintaxe e dos padrões da V1 para a V2.

A ferramenta permite regras de modificação de código para clientes de serviços do SDK e para a biblioteca de alto nível do [Gerenciador de Transferências do S3](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/transfer/TransferManager.html). As regras de modificação de código para outras APIs de alto nível, como da V1 da API [https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/datamodeling/DynamoDBMapper.html](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/datamodeling/DynamoDBMapper.html) para a V2 da [API de cliente avançado do DynamoDB](dynamodb-enhanced-client.md) não são compatíveis. 

Consulte mais detalhes sobre limitações no [final desta página](#migration-tool-limitations). Consulte exemplos detalhados de padrões de código comuns sem suporte com etapas de migração manual em [Padrões de código sem suporte](migration-tool-unsupported-patterns.md).

## Usar a ferramenta de migração
<a name="migration-tool-use"></a>

### Migrar um projeto Maven
<a name="migration-tool-use-maven"></a>

Siga as instruções abaixo para migrar seu projeto baseado no Maven do SDK para Java 1.x usando a ferramenta de [plug-in OpenRewrite Maven](https://docs.openrewrite.org/reference/rewrite-maven-plugin).

1. Acesse o diretório-raiz do projeto Maven

   Abra uma janela de terminal (linha de comando) e acesse o diretório-raiz da aplicação baseada no Maven.

1. Execute o comando `rewrite-maven-plugin` do plugin

   É possível escolher entre dois modos (metas do Maven): `dryRun` e `run`.

   **`dryRun`**** Modo**

   No modo `dryRun`, o plug-in gera logs de diferenças na saída do console e um arquivo de patch chamado `rewrite.patch` na pasta `target/rewrite`. Esse modo permite que você visualize as alterações que seriam feitas, já que nenhuma alteração é feita nos arquivos de código-fonte. 

   O exemplo a seguir mostra como invocar o plug-in no modo `dryRun`.

   ```
   mvn org.openrewrite.maven:rewrite-maven-plugin:<rewrite-plugin-version>*:dryRun \
     -Drewrite.recipeArtifactCoordinates=software.amazon.awssdk:v2-migration:<sdkversion>** \
     -Drewrite.activeRecipes=software.amazon.awssdk.v2migration.AwsSdkJavaV1ToV2
   ```

   \$1Substitua *<rewrite-plugin-version>* pelo valor de `rewriteMavenPluginVersion` exibido neste [arquivo de teste](https://github.com/aws/aws-sdk-java-v2/blob/3a01289246f1f4ac814a354051d00030e53ef968/test/v2-migration-tests/src/test/java/software/amazon/awssdk/v2migrationtests/MavenTestBase.java#L54).

   \$1\$1Substitua *<sdkversion>* por uma versão 2.x do SDK. Confira a versão mais recente em [Maven Central](https://central.sonatype.com/artifact/software.amazon.awssdk/v2-migration). 
**Importante**  
Use a versão de `rewrite-maven-plugin` mostrada no [arquivo de teste](https://github.com/aws/aws-sdk-java-v2/blob/3a01289246f1f4ac814a354051d00030e53ef968/test/v2-migration-tests/src/test/java/software/amazon/awssdk/v2migrationtests/MavenTestBase.java#L54), pois outras versões podem não funcionar.

   A saída do console do modo `dryRun` deve ser semelhante à saída a seguir.

   ```
   [WARNING] These recipes would make changes to project/src/test/resources/maven/before/pom.xml:
   [WARNING]     software.amazon.awssdk.v2migration.AwsSdkJavaV1ToV2
   [WARNING]         software.amazon.awssdk.v2migration.UpgradeSdkDependencies
   [WARNING]             org.openrewrite.java.dependencies.AddDependency: {groupId=software.amazon.awssdk, artifactId=apache-client, version=2.27.0, onlyIfUsing=com.amazonaws.ClientConfiguration}
   [WARNING]             org.openrewrite.java.dependencies.AddDependency: {groupId=software.amazon.awssdk, artifactId=netty-nio-client, version=2.27.0, onlyIfUsing=com.amazonaws.ClientConfiguration}
   [WARNING]             org.openrewrite.java.dependencies.ChangeDependency: {oldGroupId=com.amazonaws, oldArtifactId=aws-java-sdk-bom, newGroupId=software.amazon.awssdk, newArtifactId=bom, newVersion=2.27.0}
   [WARNING]             org.openrewrite.java.dependencies.ChangeDependency: {oldGroupId=com.amazonaws, oldArtifactId=aws-java-sdk-s3, newGroupId=software.amazon.awssdk, newArtifactId=s3, newVersion=2.27.0}
   [WARNING]             org.openrewrite.java.dependencies.ChangeDependency: {oldGroupId=com.amazonaws, oldArtifactId=aws-java-sdk-sqs, newGroupId=software.amazon.awssdk, newArtifactId=sqs, newVersion=2.27.0}
   [WARNING] These recipes would make changes to project/src/test/resources/maven/before/src/main/java/foo/bar/Application.java:
   [WARNING]     software.amazon.awssdk.v2migration.AwsSdkJavaV1ToV2
   [WARNING]         software.amazon.awssdk.v2migration.S3GetObjectConstructorToFluent
   [WARNING]             software.amazon.awssdk.v2migration.ConstructorToFluent
   [WARNING]         software.amazon.awssdk.v2migration.S3StreamingResponseToV2
   [WARNING]         software.amazon.awssdk.v2migration.ChangeSdkType
   [WARNING]         software.amazon.awssdk.v2migration.ChangeSdkCoreTypes
   [WARNING]             software.amazon.awssdk.v2migration.ChangeExceptionTypes
   [WARNING]                 org.openrewrite.java.ChangeType: {oldFullyQualifiedTypeName=com.amazonaws.AmazonClientException, newFullyQualifiedTypeName=software.amazon.awssdk.core.exception.SdkException}
   [WARNING]                 org.openrewrite.java.ChangeMethodName: {methodPattern=com.amazonaws.AmazonServiceException getRequestId(), newMethodName=requestId}
   [WARNING]                 org.openrewrite.java.ChangeMethodName: {methodPattern=com.amazonaws.AmazonServiceException getErrorCode(), newMethodName=awsErrorDetails().errorCode}
   [WARNING]                 org.openrewrite.java.ChangeMethodName: {methodPattern=com.amazonaws.AmazonServiceException getServiceName(), newMethodName=awsErrorDetails().serviceName}
   [WARNING]                 org.openrewrite.java.ChangeMethodName: {methodPattern=com.amazonaws.AmazonServiceException getErrorMessage(), newMethodName=awsErrorDetails().errorMessage}
   [WARNING]                 org.openrewrite.java.ChangeMethodName: {methodPattern=com.amazonaws.AmazonServiceException getRawResponse(), newMethodName=awsErrorDetails().rawResponse().asByteArray}
   [WARNING]                 org.openrewrite.java.ChangeMethodName: {methodPattern=com.amazonaws.AmazonServiceException getRawResponseContent(), newMethodName=awsErrorDetails().rawResponse().asUtf8String}
   [WARNING]                 org.openrewrite.java.ChangeType: {oldFullyQualifiedTypeName=com.amazonaws.AmazonServiceException, newFullyQualifiedTypeName=software.amazon.awssdk.awscore.exception.AwsServiceException}
   [WARNING]         software.amazon.awssdk.v2migration.NewClassToBuilderPattern
   [WARNING]             software.amazon.awssdk.v2migration.NewClassToBuilder
   [WARNING]             software.amazon.awssdk.v2migration.V1SetterToV2
   [WARNING]         software.amazon.awssdk.v2migration.V1GetterToV2
   ...
   [WARNING]         software.amazon.awssdk.v2migration.V1BuilderVariationsToV2Builder
   [WARNING]         software.amazon.awssdk.v2migration.NewClassToBuilderPattern
   [WARNING]             software.amazon.awssdk.v2migration.NewClassToBuilder
   [WARNING]             software.amazon.awssdk.v2migration.V1SetterToV2
   [WARNING]         software.amazon.awssdk.v2migration.HttpSettingsToHttpClient
   [WARNING]         software.amazon.awssdk.v2migration.WrapSdkClientBuilderRegionStr
   [WARNING] Patch file available:
   [WARNING]     project/src/test/resources/maven/before/target/rewrite/rewrite.patch
   [WARNING] Estimate time saved: 20m
   [WARNING] Run 'mvn rewrite:run' to apply the recipes.
   ```

   **`run`**** Modo**

   Quando você executa o plug-in no modo `run`, ele modifica o código-fonte no disco para aplicar as alterações. Faça backup do código-fonte antes de executar o comando.

   O exemplo a seguir mostra como invocar o plug-in no modo `run`.

   ```
   mvn org.openrewrite.maven:rewrite-maven-plugin:<rewrite-plugin-version>*:run \
     -Drewrite.recipeArtifactCoordinates=software.amazon.awssdk:v2-migration:<sdkversion>** \
     -Drewrite.activeRecipes=software.amazon.awssdk.v2migration.AwsSdkJavaV1ToV2
   ```

   \$1Substitua *<rewrite-plugin-version>* pelo `rewriteMavenPluginVersionvalue` exibido neste [arquivo de teste](https://github.com/aws/aws-sdk-java-v2/blob/3a01289246f1f4ac814a354051d00030e53ef968/test/v2-migration-tests/src/test/java/software/amazon/awssdk/v2migrationtests/MavenTestBase.java#L54).

   \$1\$1Substitua *<sdkversion>* por uma versão 2.x do SDK. Confira a versão mais recente em [Maven Central](https://central.sonatype.com/artifact/software.amazon.awssdk/v2-migration). 

   Depois de executar o comando, faça uma compilação da aplicação e realize testes para verificar as alterações. 

### Migrar um projeto Gradle
<a name="migration-tool-use-gradle"></a>

Siga as instruções abaixo para migrar seu projeto baseado no Gradle do SDK para Java 1.x usando a ferramenta de [plug-in OpenRewrite Gradle](https://docs.openrewrite.org/reference/gradle-plugin-configuration).

1. Acesse o diretório-raiz do projeto Gradle

   Abra uma janela de terminal (linha de comando) e acesse o diretório-raiz da aplicação baseada no Gradle.

1. Criar um script de inicialização do Gradle

   Crie um arquivo `init.gradle` com o conteúdo a seguir no diretório.

   ```
   initscript {
       repositories {
           maven { url "https://plugins.gradle.org/m2" }
       }
       dependencies {
           classpath("org.openrewrite:plugin:<rewrite-plugin-version>*")
       }
   }
   
   rootProject {
       plugins.apply(org.openrewrite.gradle.RewritePlugin)
       dependencies {
           rewrite("software.amazon.awssdk:v2-migration:latest.release")
       }
   
       afterEvaluate {
           if (repositories.isEmpty()) {
               repositories {
                   mavenCentral()
               }
           }
       }
   }
   ```

   \$1Substitua *<rewrite-plugin-version>* pela versão exibida neste [arquivo de teste](https://github.com/aws/aws-sdk-java-v2/blob/master/test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/gradle/before/init.gradle#L6).

1. Execute o comando `rewrite`

   Assim como no plug-in Maven, você pode executar o plug-in Gradle no modo `dryRun` or `run`.

   **Modo `dryRun`**

   O exemplo a seguir mostra como invocar o plug-in no modo `dryRun`.

   ```
   gradle rewriteDryRun --init-script init.gradle \
     -Drewrite.activeRecipes=software.amazon.awssdk.v2migration.AwsSdkJavaV1ToV2
   ```

   **Modo `run`**

   O exemplo a seguir mostra como invocar o plug-in no modo `run`.

   ```
   gradle rewriteRun --init-script init.gradle \
     -Drewrite.activeRecipes=software.amazon.awssdk.v2migration.AwsSdkJavaV1ToV2
   ```

## Limitações atuais
<a name="migration-tool-limitations"></a>

Embora a migração seja compatível com a maioria dos códigos da V1 por meio de regras de modificação de código que são atualizadas para o equivalente da V2, algumas classes e métodos não são abordados. Referente a essas classes e métodos, siga as [instruções passo a passo](migration-steps.md) para migrar o código manualmente.

Para algumas regras de modificação de código incompatíveis, a ferramenta de migração pode adicionar um comentário que comece com:

```
/*AWS SDK for Java v2 migration: Transform for ...
```

Após o comentário, a ferramenta gera um esboço genérico da versão V2 do método ou da classe. Por exemplo, na saída a seguir, a ferramenta de migração tentou migrar o método `setBucketLifecycleConfiguration` do cliente V1 do S3:

```
/*AWS SDK for Java v2 migration: Transform for setBucketLifecycleConfiguration method not supported. 
Please manually migrate your code by using builder pattern, update from BucketLifecycleConfiguration.Rule 
to LifecycleRule, StorageClass to TransitionStorageClass, and adjust imports and names.*/
s3.putBucketLifecycleConfiguration(
        PutBucketLifecycleConfigurationRequest.builder()
            .bucket(bucketName)
            .lifecycleConfiguration(BucketLifecycleConfiguration.builder()
                .build())
            .build());
```

Os links na lista abaixo abrem informações de migração para ajudar você a migrar o código manualmente.
+ [Diferenças do cliente S3 entre a versão 1 e a versão 2 do AWS SDK para Java](migration-s3-client.md)
+ [Gerenciador de Transferências do S3](migration-s3-transfer-manager.md) (TransferManager)
+ [Mapeamento de objetos do DynamoDB](migration-ddb-mapper.md) (DynamoDBMapper)
+ [Utilitário de metadados do EC2](migration-imds.md) (EC2MetadataUtils)
+ [Waiters](migration-waiters.md) (AmazonDynamoDBWaiters)
+ [Compilador de Políticas do IAM](migration-iam-policy-builder.md) (Policy)
+ [Pré-assinatura do CloudFront](migration-cloudfront-presigning.md) (CloudFrontUrlSigner, CloudFrontCookieSigner)
+ [Notificações de Eventos do S3](migration-s3-event-notification.md) (S3EventNotification)
+ Publicação de métricas do SDK ([documentação da 1.x](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/generating-sdk-metrics.html), [documentação da 2.x](metrics.md))
+ [Padrões de código incompatíveis](migration-tool-unsupported-patterns.md): exemplos detalhados de padrões de código comuns que exigem migração manual

# Padrões de código incompatíveis da ferramenta de migração
<a name="migration-tool-unsupported-patterns"></a>

A ferramenta de migração converte automaticamente a maior parte do código da v1 para a v2. No entanto, alguns padrões de código exigem migração manual. Este tópico fornece exemplos detalhados dos padrões incompatíveis mais comuns e mostra como convertê-los manualmente.

A lista de padrões a seguir não está completa. Se seu código não for compilado após a execução da ferramenta de migração, siga as [instruções de step-by-step migração](migration-steps.md) para migrar manualmente o código v1 restante.

## Solicitar construtores de objetos com parâmetros
<a name="request-pojo-constructors"></a>

Para solicitação POJOs (excluindo o Amazon S3), a ferramenta de migração transforma somente os métodos setter. A ferramenta não é compatível com construtores com parâmetros.

**Padrão compatível: objeto de solicitação usando setters (sem parâmetros de construtor)**

Antes (código original da v1):

```
import com.amazonaws.services.sqs.model.SendMessageRequest;

SendMessageRequest request = new SendMessageRequest().withMessageBody("Hello World");
request.setQueueUrl("https://sqs.us-west-2.amazonaws.com/0123456789012/demo-queue");
```

Depois (resultado da ferramenta de migração):

```
import software.amazon.awssdk.services.sqs.model.SendMessageRequest;

SendMessageRequest request = SendMessageRequest.builder()
    .messageBody("Hello World").build();
request = request.toBuilder()
    .queueUrl("https://sqs.us-west-2.amazonaws.com/0123456789012/demo-queue").build();
```

**Padrão incompatível: construtor de objeto de solicitação com parâmetros**

A ferramenta de migração não pode converter construtores com parâmetros:

Antes da migração manual, mas depois da ferramenta de migração:

```
import software.amazon.awssdk.services.sqs.model.SendMessageRequest; // Import updated to v2.

// This pattern requires manual migration.
SendMessageRequest request = new SendMessageRequest(
    "https://sqs.us-west-2.amazonaws.com/0123456789012/demo-queue", 
    "Hello World");
```

A ferramenta de migração transforma a importação para a v2, mas o código do construtor permanece inalterado e requer atualizações manuais para usar o padrão do construtor.

Após a migração manual:

```
import software.amazon.awssdk.services.sqs.model.SendMessageRequest;

SendMessageRequest request = SendMessageRequest.builder()
    .messageBody("Hello World")
    .queueUrl("https://sqs.us-west-2.amazonaws.com/0123456789012/demo-queue")
    .build();
```

## Métodos do cliente de serviço com parâmetros individuais
<a name="service-client-method-overloads"></a>

A ferramenta de migração não pode converter métodos de cliente de serviço que usam parâmetros individuais em vez de objetos de solicitação (exceto Amazon S3).

Antes (código da v1):

```
import com.amazonaws.services.sqs.AmazonSQS;
import com.amazonaws.services.sqs.AmazonSQSClient;

AmazonSQS sqs = new AmazonSQSClient();
// The following v1 method takes individual parameters.
sqs.sendMessage("https://sqs.us-west-2.amazonaws.com/0123456789012/demo-queue", "Hello World");
```

Depois (resultado da ferramenta de migração: não compila):

```
import software.amazon.awssdk.services.sqs.SqsClient;  // Import updated to v2.
// No import statement for the v2 request POJO.

SqsClient sqs = SqsClient.builder().build();

// Does not compile–v2 methods only accept request POJOs.
sqs.sendMessage("https://sqs.us-west-2.amazonaws.com/0123456789012/demo-queue", "Hello World");
```

Você deve atualizar manualmente os argumentos do método para usar um objeto de solicitação:

```
import software.amazon.awssdk.services.sqs.SqsClient;
import software.amazon.awssdk.services.sqs.model.SendMessageRequest; // Add manually.

SqsClient sqs = SqsClient.builder().build();

// Corrected v2 code.
SendMessageRequest request = SendMessageRequest.builder()
    .queueUrl("https://sqs.us-west-2.amazonaws.com/0123456789012/demo-queue")
    .messageBody("Hello World")
    .build();
sqs.sendMessage(request);
```

## Métodos de tempo limite da solicitação
<a name="request-pojo-timeout-configuration"></a>

A ferramenta de migração não converte métodos que definem tempo limite em objetos de solicitação.

Antes (código da v1):

```
import com.amazonaws.services.sqs.model.SendMessageRequest;

SendMessageRequest request = new SendMessageRequest();
request.setSdkRequestTimeout(7);
```

Depois (resultado da ferramenta de migração: não compila):

```
import software.amazon.awssdk.services.sqs.model.SendMessageRequest;  // Import updated to v2.

SendMessageRequest request = SendMessageRequest.builder().build();

// Does not compile.
request.setSdkRequestTimeout(7);
```

Você deve migrar manualmente para usar o método `overrideConfiguration` da v2:

```
import software.amazon.awssdk.services.sqs.model.SendMessageRequest;
import java.time.Duration;

SendMessageRequest request = SendMessageRequest.builder().build();

// Corrected v2 code.
request = request.toBuilder()
    .overrideConfiguration(o -> o.apiCallTimeout(Duration.ofSeconds(7)))
    .build();
```

## Construtores de clientes de serviço com parâmetros
<a name="service-client-constructors-with-args"></a>

A ferramenta de migração converte construtores de cliente de serviço vazios, mas não pode converter construtores que aceitam parâmetros como credenciais ou configuração.

Antes (código da v1):

```
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.sqs.AmazonSQS;
import com.amazonaws.services.sqs.AmazonSQSClient;

AWSCredentials awsCredentials = new BasicAWSCredentials("akid", "skid");
AmazonSQS sqs = new AmazonSQSClient(awsCredentials);
```

Depois (resultado da ferramenta de migração: não compila):

```
import software.amazon.awssdk.auth.credentials.AwsCredentials;
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
import software.amazon.awssdk.services.sqs.SqsClient;  // Import updated to v2.

AwsCredentials awsCredentials = AwsBasicCredentials.create("akid", "skid");

// Does not compile.
SqsClient sqs = new SqsClient(awsCredentials);
```

Você deve atualizar manualmente o construtor do cliente de serviço para usar o padrão do compilador:

```
import software.amazon.awssdk.auth.credentials.AwsCredentials;
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;  // Add manually.
import software.amazon.awssdk.services.sqs.SqsClient;

AwsCredentials awsCredentials = AwsBasicCredentials.create("akid", "skid");

// Corrected v2 code.
SqsClient sqs = SqsClient.builder()
    .credentialsProvider(StaticCredentialsProvider.create(awsCredentials))
    .build();
```