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.
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.