Alejandría

Busca en Alejandría

Herramientas

OpenRewrite

Motor de refactorización automatizada que aplica recetas de transformación sobre código.

01

En pocas palabras

Motor de refactorización automatizada que aplica recetas de transformación sobre código.

Qué problema resuelve

Cambios repetitivos difíciles de ejecutar de forma consistente en muchos repositorios.

Cuándo utilizarlo

Actualizaciones de APIs y frameworks. Ejemplo: migrar usos de una biblioteca en servicios Java.

02

De la idea a la práctica

Funcionamiento, ejemplos y decisiones para pasar al siguiente nivel.

En el Radar compartido: Trial (valoración de la edición aportada).

Cómo funciona

Utiliza representaciones del código para aplicar transformaciones estructuradas. Las recetas describen actualizaciones de dependencias, APIs y convenciones.

Ejemplo de uso

Ejecutar una receta de actualización en un servicio piloto; inspeccionar el diff y ejecutar pruebas de contrato. Reutilizar la configuración validada para otros servicios equivalentes.

Lossless Semantic Trees

OpenRewrite representa el código como un LST: un árbol sintáctico con información de tipos que conserva formato, comentarios y espacios. Por eso una receta puede cambiar javax.* por jakarta.* solo donde el tipo realmente corresponde, sin el riesgo de un buscar-y-reemplazar, y el diff resultante respeta el estilo del archivo.

Ejecutar una receta con Maven

# Ver el cambio sin aplicarlo: genera target/rewrite/rewrite.patch
mvn -U org.openrewrite.maven:rewrite-maven-plugin:dryRun \
  -Drewrite.recipeArtifactCoordinates=org.openrewrite.recipe:rewrite-spring:RELEASE \
  -Drewrite.activeRecipes=org.openrewrite.java.spring.boot3.UpgradeSpringBoot_3_5

# Aplicar
mvn -U org.openrewrite.maven:rewrite-maven-plugin:run \
  -Drewrite.recipeArtifactCoordinates=org.openrewrite.recipe:rewrite-spring:RELEASE \
  -Drewrite.activeRecipes=org.openrewrite.java.spring.boot3.UpgradeSpringBoot_3_5

Existen plugins equivalentes para Gradle y la CLI de Moderne para ejecutar recetas sobre muchos repositorios a la vez.

Recetas declarativas propias

# rewrite.yml
type: specs.openrewrite.org/v1beta/recipe
name: com.krediya.ModernizarServicio
displayName: Estándares de servicios KrediYa
recipeList:
  - org.openrewrite.java.migrate.UpgradeToJava21
  - org.openrewrite.java.testing.junit5.JUnit4to5Migration
  - org.openrewrite.java.ChangeType:
      oldFullyQualifiedTypeName: com.krediya.legacy.Money
      newFullyQualifiedTypeName: com.krediya.core.Dinero
  - org.openrewrite.java.dependencies.UpgradeDependencyVersion:
      groupId: com.fasterxml.jackson.core
      artifactId: '*'
      newVersion: 2.x

Familias de recetas útiles

Familia Ejemplos
Migración de plataforma Java 8 → 17 → 21, javax → jakarta
Frameworks Spring Boot 2 → 3, Spring Security, Hibernate
Pruebas JUnit 4 → 5, AssertJ, Mockito
Seguridad Corrección de patrones inseguros, XXE, uso de criptografía débil
Estilo y limpieza Imports no usados, final, formato común
Otros lenguajes Recetas para Kotlin, Groovy, YAML, XML, propiedades, y soporte creciente para JavaScript, TypeScript y Python

Combinarlo con IA

Las recetas son deterministas y repetibles, ideales para el 80 % mecánico de una migración. Los casos que no cubren (APIs internas, lógica ambigua) encajan con AI for code migrations: la IA propone, las pruebas verifican. Una práctica eficaz es pedir al agente que escriba una receta en lugar de editar cien archivos a mano.

Criterios de implementación

Distinguir cambios mecánicos de decisiones de negocio. Mantener versiones de recetas y toolchain fijadas y tratar manualmente los casos no cubiertos.

Continúa en las fuentes

Documentación oficial para verificar detalles y explorar más.