OpenRewrite: Migration einfach gemacht

25.08.2023

Wer kennt es nicht: Die Migration auf die neue Java LTS Version steht an. Man hangelt sich von einem Problem zum Nächsten. Die Aufwände explodieren und das Thema wird erstmal nach hinten geschoben. Glücklicherweise gibt es hier auch eine einfachere Möglichkeit: OpenRewrite

Was ist OpenRewrite?

OpenRewrite ist ein Tool, mit dem man große, automatisierte Refactorings durchführen kann. Für verschiedene Anwendungsfälle, wie Framework Migrationen, API-Migrationen und vieles mehr gibt es verschiedene Rezepte. Einfache Rezepte für Java bieten zum Beispiel die Möglichkeit, ungenutzte Imports zu entfernen oder fehlende Lizenzheader hinzuzufügen. Es gibt aber auch komplexere Rezepte, die eine Migration auf Java 17 oder das Upgrade von Spring Boot 2.x auf Spring Boot 3.0 ermöglichen.

Wie funktioniert OpenRewrite?

OpenRewrite verwendet kein einfaches „Search and Replace“, sondern eine semantische Suche. Genauer gesagt handelt es sich um Lossless Semantic Trees. Die einzelnen Elemente der Java-Klassen werden in eine Baumstruktur überführt. Anhand dieser Elemente werden dann die Aktionen durchgeführt. Genauere Informationen, wie das funktioniert, gibt es hier. Versteht man, wie OpenRewrite funktioniert, lassen sich auch eigene Rezepte implementieren. Die meisten der größeren Rezepte bestehen dabei aus vielen kleineren Rezepten. Es lassen sich also auch bestehende Rezepte wiederverwenden.

Wie setze ich es ein?

OpenRewrite lässt sich entweder über Maven oder Gradle einsetzen. Für Maven müssen die folgenden Schritte ausgeführt werden. Die Snippets für die Plugin Konfiguration bzw. den entsprechenden Einzeiler Befehl sind jeweils auf der Doku-Seite zu finden und können einfach kopiert werden.

Plugin mit entsprechendem Rezept hinzufügen

<build>
  <plugins>
    <plugin>
      <groupId>org.openrewrite.maven</groupId>
      <artifactId>rewrite-maven-plugin</artifactId>
      <version>5.3.2</version>
      <configuration>
        <activeRecipes>
          <recipe>org.openrewrite.java.migrate.UpgradeToJava17</recipe>
        </activeRecipes>
      </configuration>
      <dependencies>
        <dependency>
          <groupId>org.openrewrite.recipe</groupId>
          <artifactId>rewrite-migrate-java</artifactId>
          <version>2.1.0</version>
        </dependency>
      </dependencies>
    </plugin>
  </plugins>
</build>

Maven Command ausführen

mvn rewrite:run

Alternative

Wer sein Projekt nicht anpassen möchte, kann den Maven Befehl auch direkt ausführen. Für das Beispiel oben sieht das dann wie folgt aus:

mvn -U org.openrewrite.maven:rewrite-maven-plugin:run \
  -Drewrite.recipeArtifactCoordinates=org.openrewrite.recipe:rewrite-migrate-java:RELEASE \
  -Drewrite.activeRecipes=org.openrewrite.java.migrate.UpgradeToJava17

Nachdem das Rezept ausgeführt wurde, empfiehlt es sich trotzdem nochmal alle Anpassungen zu prüfen.

Weitere Infos zur Ausführung findet man unter: https://docs.openrewrite.org/running-recipes

Fazit

Bei doubleSlash wurde OpenRewrite mittlerweile mehrfach erfolgreich in Projekten eingesetzt. So konnten teilweise Microservices in unter einer Stunde von Spring 2.x auf 3.0 aktualisiert werden, inklusive Update von Java 11 auf Java 17. Es lohnt sich also auf jeden Fall mal einen Blick über die Rezepte von OpenRewrite zu werfen https://docs.openrewrite.org/recipes. Vermutlich ist hier für jedes Projekt etwas dabei und mittlerweile gibt es neben Java auch Rezepte für viele andere Sprachen, Frameworks und Libraries.


Bild-Quelle:

https://2974513519-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MEpVPBLKMRCi8CpJ6ep%2Fuploads%2Fgit-blob-9bf395ce5ce1272eaa32eda00a9c2ab599caadac%2FOpenRewrite.gif?alt=media

Zurück zur Übersicht

Kommentar verfassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

*Pflichtfelder

*