OpenRewrite: Automatisierte Migration für moderne Java-Projekte

Java-Migrationen effizient automatisieren: Erfahren Sie, wie OpenRewrite mittels LST-Analyse und Build-Integration das manuelle Refactoring ersetzt.

Veröffentlicht:
Kategorie:
nterra blog open rewrite java migration automatisierung
nterra blog open rewrite java migration automatisierung

Die kontinuierliche Weiterentwicklung von Java bringt sowohl Chancen als auch Herausforderungen mit sich. Insbesondere bei der Migration älterer Codebasen auf aktuelle Versionen wie Java 17 oder 21 stoßen Entwickler häufig auf komplexe Probleme. OpenRewrite bietet eine Lösung, die nicht nur die Migration erleichtert, sondern auch Best Practices integriert.

Was ist OpenRewrite?

OpenRewrite ist ein Open-Source-Tool, das Entwicklern hilft, ihre Java-Projekte automatisiert und sicher zu modernisieren. Im Gegensatz zu einfachen „Search and Replace“-Ansätzen verwendet OpenRewrite eine semantische Analyse, um Änderungen präzise und kontextbewusst vorzunehmen. Dies geschieht durch die Umwandlung des Codes in einen sogenannten Lossless Semantic Tree (LST), der eine tiefere Analyse ermöglicht.1

Die Hauptkomponenten von OpenRewrite sind:

  • Rezepte (Recipes): Wiederverwendbare Einheiten, die spezifische Refactoring-Aufgaben durchführen, wie z.B. das Aktualisieren von Abhängigkeiten oder das Migrieren von Frameworks.2
  • Visitor-Pattern: Ein Designmuster, das es ermöglicht, Operationen auf den Knoten des LSTs durchzuführen, ohne die Struktur des Baums zu verändern.

Diese Architektur ermöglicht es, komplexe Migrationsaufgaben in überschaubare Schritte zu unterteilen und so die Wartbarkeit und Erweiterbarkeit zu erhöhen.

OpenRewrite wurde von einem Netflix-Mitarbeiter ins Leben gerufen, um tausende Java-Projekte mit minimalem manuellem Aufwand zu modernisieren. Das Fundament für diese Skalierbarkeit ist der Lossless Semantic Tree um Code-Änderungen nicht nur oberflächlich, sondern mit vollem semantischem Verständnis präzise über riesige Codebasen hinweg durchzuführen. So gelang es Netflix beispielsweise, ca. 80 % von 3000 Services und 1500 Libraries automatisiert auf Spring Boot 3 zu aktualisieren.

Wer sich hier für Details interessiert, kann sich mal dieses Youtube-Video zu gemüte führen.

nterra Blog - Open Rewrite LST Lossless Semantic Tree
nterra Blog - Open Rewrite LST Lossless Semantic Tree

Hands-on: Migration von JUnit 4 auf JUnit 5

Ein häufiges Szenario in der Java-Welt ist die Migration von JUnit 4 auf JUnit 5. OpenRewrite bietet hierfür ein spezielles Rezept, das automatisch:

  • Die Annotationen von @Test auf @org.junit.jupiter.api.Test ändert.
  • Assertions von org.junit.Assert auf org.junit.jupiter.api.Assertions aktualisiert.4
  • Die Sichtbarkeit von Testmethoden anpasst.
  • Veraltete @Before– und @After-Methoden durch @BeforeEach bzw. @AfterEach ersetzt.5 

Ein Beispiel für die Anwendung dieses Rezepts in einer Maven-Konfiguration:

XML

<activeRecipes>

  <recipe>org.openrewrite.java.testing.junit5.JUnit5BestPractices</recipe>
</activeRecipes>
<dependencies>
  <dependency>
    <groupId>org.openrewrite.recipe</groupId>
    <artifactId>rewrite-testing-frameworks</artifactId>
    <version>2.0.12</version>
  </dependency>
</dependencies>

Nach der Ausführung des Befehls mvn rewrite:run werden alle Tests entsprechend aktualisiert. 6

Migration auf Java 17 und 21

Die Aktualisierung der Java-Version ist ein weiterer häufiger Anwendungsfall für OpenRewrite. Für die Migration auf Java 17 bietet OpenRewrite ein spezielles Rezept, das unter anderem:

  • Veraltete APIs identifiziert und ersetzt.
  • Abhängigkeiten aktualisiert, um mit dem neuen Modul-System kompatibel zu sein. 7
  • Warnungen vor illegalem reflektierenden Zugriff adressiert. 8

Ein Beispiel für die Anwendung dieses Rezepts in einer Maven-Konfiguration:

XML

<activeRecipes>
  <recipe>org.openrewrite.java.migrate.UpgradeToJava17</recipe>
</activeRecipes>
<dependencies>
  <dependency>
    <groupId>org.openrewrite.recipe</groupId>
    <artifactId>rewrite-migrate-java</artifactId>
    <version>2.1.0</version>
  </dependency>
</dependencies>


Für die Migration auf Java 21 steht ein weiteres Rezept zur Verfügung, das ähnliche Aufgaben übernimmt und zusätzlich Unterstützung für sequenzielle Collections bietet.9

Integration in Build-Prozesse

OpenRewrite lässt sich nahtlos in bestehende Build-Prozesse integrieren. Sowohl Maven als auch Gradle werden unterstützt. Für Maven-Projekte wird das Plugin rewrite-maven-plugin verwendet, während für Gradle-Projekte das Plugin org.openrewrite.rewrite zum Einsatz kommt. 10

Ein Beispiel für die Konfiguration in einer pom.xml:

XML

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

Nach der Konfiguration kann der Befehl mvn rewrite:run ausgeführt werden, um die Migration durchzuführen. 11

Fazit

OpenRewrite stellt eine leistungsfähige und flexible Lösung für die automatisierte Migration und Refaktorisierung von Java-Projekten dar. Durch die Verwendung von semantischer Analyse und wiederverwendbaren Rezepten können Entwickler sicherstellen, dass ihre Codebasen stets auf dem neuesten Stand der Technik sind, ohne dabei die Kontrolle oder Qualität zu verlieren. Die Integration in bestehende Build-Prozesse und die Unterstützung für gängige Frameworks und Bibliotheken machen OpenRewrite zu einem unverzichtbaren Werkzeug für moderne Java-Entwicklungsteams.

Ähnliche Blogartikel

  • Tutorial: ZUGFeRD & XRechnung mit Java

    Wie man mit Java Spring Boot und Mustangproject in wenigen Minuten ein Tool zur Generierung von ZUGFeRD-PDFs und XRechnungen baut.

  • Observability – ein Gamechanger

    Erfahren Sie, wie Sie mit Observability volle Sichtbarkeit in den Systembetrieb bringen.

  • Neue Partner an Bord: Seeburger & Lobster erweitern unser Portfolio

    Wir begrüßen mit Seeburger und Lobster zwei neue Technologiepartner, die unser Portfolio im Bereich Datenintegration und Prozessdigitalisierung ideal ergänzen.