

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Herramienta de migración de AWS SDK para Java
<a name="migration-tool"></a>

AWS SDK para Java proporciona una herramienta de migración que ayuda a automatizar la migración del SDK para código Java 1.x (V1) a 2.x (V2). La herramienta utiliza [OpenRewrite](https://docs.openrewrite.org/), una herramienta de refactorización del código fuente abierto, para realizar la migración. OpenRewrite utiliza reglas de modificación de código (denominadas “fórmulas”) para actualizar automáticamente el código fuente de sintaxis y patrones de V1 a V2.

La herramienta admite las reglas de modificación de código para clientes de servicio del SDK y la biblioteca de alto nivel de [S3 Transfer Manager](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/transfer/TransferManager.html). No se admiten reglas de modificación de código para otras API de alto nivel, como [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) de la V1 a la [API DynamoDB Enhanced Client](dynamodb-enhanced-client.md) de la V2. 

Para obtener más información sobre las limitaciones, consulte el [final de esta página](#migration-tool-limitations). Para ver ejemplos detallados de patrones de código comunes no admitidos con pasos de migración manual, consulte [Patrones de código no admitidos](migration-tool-unsupported-patterns.md).

## Uso de la herramienta de migración
<a name="migration-tool-use"></a>

### Migración de un proyecto de Maven
<a name="migration-tool-use-maven"></a>

Siga las instrucciones que aparecen a continuación para migrar un proyecto basado en Maven del SDK para Java 1.x mediante la herramienta [Complemento OpenRewrite Maven](https://docs.openrewrite.org/reference/rewrite-maven-plugin).

1. Navegación al directorio raíz del proyecto de Maven

   Abra una ventana de terminal (línea de comandos) y acceda al directorio raíz de la aplicación basada en Maven.

1. Ejecución del comando `rewrite-maven-plugin` del plugin

   Puede elegir entre dos modos (objetivos de Maven): `dryRun` y `run`.

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

   En el modo `dryRun`, el complemento genera registros de diferencias en la salida de la consola y un archivo de parche llamado `rewrite.patch` en la carpeta `target/rewrite`. Este modo permite previsualizar los cambios que se realizarían, ya que no se realizan cambios en los archivos de código fuente. 

   El siguiente ejemplo muestra cómo invocar el complemento en 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
   ```

   \$1Sustituya *<rewrite-plugin-version>* por el valor `rewriteMavenPluginVersion` que aparece en este [archivo de prueba](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\$1Sustituya *<sdkversion>* por una versión 2.x del SDK. Visite [Central de Maven](https://central.sonatype.com/artifact/software.amazon.awssdk/v2-migration) para comprobar si hay una nueva versión. 
**importante**  
Asegúrese de usar la versión del `rewrite-maven-plugin` que se muestra en el [archivo de prueba](https://github.com/aws/aws-sdk-java-v2/blob/3a01289246f1f4ac814a354051d00030e53ef968/test/v2-migration-tests/src/test/java/software/amazon/awssdk/v2migrationtests/MavenTestBase.java#L54), ya que es posible que otras versiones no funcionen.

   La salida de la consola del modo `dryRun` debe ser similar a la siguiente.

   ```
   [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**

   Cuando ejecuta el complemento en modo `run`, se modifica el código fuente del disco para aplicar los cambios. Asegúrese de tener una copia de seguridad del código fuente antes de ejecutar el comando.

   El siguiente ejemplo muestra cómo invocar el complemento en 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
   ```

   \$1Sustituya <rewrite-plugin-version> por el `rewriteMavenPluginVersionvalue` que aparece en este [archivo de prueba](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\$1Sustituya *<sdkversion>* por una versión 2.x del SDK. Visite [Central de Maven](https://central.sonatype.com/artifact/software.amazon.awssdk/v2-migration) para comprobar si hay una nueva versión. 

   Tras ejecutar el comando, compile la aplicación y ejecute pruebas para comprobar los cambios. 

### Migración de un proyecto de Gradle
<a name="migration-tool-use-gradle"></a>

Siga las instrucciones que aparecen a continuación para migrar un proyecto basado en Gradle del SDK para Java 1.x mediante la herramienta [Complemento OpenRewrite Gradle](https://docs.openrewrite.org/reference/gradle-plugin-configuration).

1. Navegación al directorio raíz del proyecto de Gradle

   Abra una ventana de terminal (línea de comandos) y acceda al directorio raíz de la aplicación basada en Gradle.

1. Creación de un script de inicio de Gradle

   Cree un archivo `init.gradle` con el contenido siguiente en el directorio.

   ```
   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()
               }
           }
       }
   }
   ```

   \$1Sustituya *<rewrite-plugin-version>* por la versión que aparece en este [archivo de prueba](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. Ejecute el comando `rewrite`

   Al igual que con el complemento de Maven, puede ejecutar el complemento de Gradle en modo `dryRun` o `run`.

   **`dryRun` Modo**

   El siguiente ejemplo muestra cómo invocar el complemento en modo `dryRun`.

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

   **`run` Modo**

   El siguiente ejemplo muestra cómo invocar el complemento en modo `run`.

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

## Limitaciones actuales
<a name="migration-tool-limitations"></a>

Si bien la migración admite la mayor parte del código de la V1 mediante reglas de modificación de código que se actualizan al equivalente de la V2, algunas clases y métodos no están cubiertos. Para estas clases y métodos, siga las [instrucciones paso a paso](migration-steps.md) para migrar el código manualmente.

En el caso de algunas reglas de modificación de código no compatibles, la herramienta de migración puede agregar un comentario que comience por:

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

Tras el comentario, la herramienta genera un código auxiliar genérico de la versión V2 del método o la clase. Por ejemplo, en el siguiente resultado, la herramienta de migración intentó migrar el método `setBucketLifecycleConfiguration` del cliente V1 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());
```

Los enlaces de la lista siguiente le llevan a la información sobre migración para ayudarle a migrar el código manualmente.
+ [Diferencias del cliente S3 entre la versión 1 y la versión 2 del AWS SDK para Java](migration-s3-client.md)
+ [S3 Transfer Manager](migration-s3-transfer-manager.md) (TransferManager)
+ [Asignación de objetos de DynamoDB](migration-ddb-mapper.md) (DynamoDBMapper)
+ [Utilidad de metadatos de EC2](migration-imds.md) (EC2MetadataUtils)
+ [Esperadores](migration-waiters.md) (AmazonDynamoDBWaiters)
+ [Generador de políticas de IAM](migration-iam-policy-builder.md) (Policy)
+ [Prefirma de CloudFront](migration-cloudfront-presigning.md) (CloudFrontUrlSigner, CloudFrontCookieSigner)
+ [Notificaciones de eventos de S3](migration-s3-event-notification.md) (S3EventNotification)
+ Publicación de métricas de SDK ([documentación de 1.x](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/generating-sdk-metrics.html), [documentación de 2.x](metrics.md))
+ [Patrones de código no compatibles](migration-tool-unsupported-patterns.md): ejemplos detallados de patrones de código comunes que requieren migración manual

# Patrones de código no compatibles de la herramienta de migración
<a name="migration-tool-unsupported-patterns"></a>

La herramienta de migración convierte automáticamente la mayor parte del código de la v1 a la v2. Sin embargo, algunos patrones de código requieren migración manual. En este tema se proporcionan ejemplos detallados de los patrones no compatibles más comunes y se muestra cómo convertirlos manualmente.

Lo que sigue no es una lista de patrones exhaustiva. Si el código no se compila después de ejecutar la herramienta de migración, sigue las [instrucciones de step-by-step migración](migration-steps.md) para migrar manualmente el resto del código de la versión 1.

## Solicitud de constructores de objetos con parámetros
<a name="request-pojo-constructors"></a>

A petición POJOs (excepto Amazon S3), la herramienta de migración solo transforma los métodos setter. La herramienta no admite constructores con parámetros.

**Patrón compatible: solicite un objeto mediante setters (sin parámetros de constructor)**

Antes (código de v1 original):

```
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");
```

Después (resultado de la herramienta de migración):

```
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();
```

**Patrón no compatible: solicite un constructor de objetos con parámetros**

La herramienta de migración no puede convertir constructores con parámetros:

Antes de la migración manual, pero después de la herramienta de migración:

```
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");
```

La herramienta de migración transforma la importación a la v2, pero el código del constructor permanece sin cambios y requiere actualizaciones manuales para utilizar el patrón del compilador.

Después de la migración 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 del cliente de servicio con parámetros individuales
<a name="service-client-method-overloads"></a>

La herramienta de migración no puede convertir los métodos del cliente de servicio que utilizan parámetros individuales en lugar de objetos de solicitud (excepto Amazon S3).

Antes (código de 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");
```

Después (resultado de la herramienta de migración, no se 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");
```

Debe actualizar manualmente los argumentos del método para usar un objeto de solicitud:

```
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 tiempo de espera de solicitud
<a name="request-pojo-timeout-configuration"></a>

La herramienta de migración no convierte los métodos que establecen tiempos de espera en objetos de solicitud.

Antes (código de v1):

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

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

Después (resultado de la herramienta de migración, no se compila):

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

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

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

Debe migrar manualmente para usar el método `overrideConfiguration` de la 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();
```

## Constructores de clientes de servicio con parámetros
<a name="service-client-constructors-with-args"></a>

La herramienta de migración convierte los constructores de clientes de servicio vacíos, pero no puede convertir los constructores que aceptan parámetros como credenciales o configuración.

Antes (código de 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);
```

Después (resultado de la herramienta de migración, no se 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);
```

Debe actualizar manualmente el constructor de clientes de servicio para utilizar el patrón del 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();
```