Java 21/25 Migration Roadmap

Von Java 8/11/17 zu Java 21/25: Sprache, Build, Runtime, Libraries, Container und Tests sicher modernisieren.

Version 3Java RuntimeCodeDiagramm
Diagramm Java 21/25 Migration Roadmap
Fachlich-technische Darstellung zu Java 21/25 Migration Roadmap.

Warum eine Java-Migration kein reines JDK-Update ist

Eine Enterprise-Java-Migration betrifft Quellcode, Bytecode, Build-Plugins, Container-Images, Reflection, Security Provider, TLS, JDBC-Treiber, Application Server, Libraries und Betriebsprozesse. Java 21 ist für viele Unternehmen die moderne produktive Basis; Java 25 ist die aktuelle LTS-Linie und sollte für neue Zielplattformen geprüft werden. Wichtig ist eine kontrollierte Sequenz statt Big Bang.

Empfohlene Reihenfolge

Zuerst wird der Build reproduzierbar gemacht: Maven Compiler Plugin, Toolchains, Enforcer und CI-Image. Danach werden Tests und Characterization Tests ergänzt. Anschließend kommen Library-Upgrades, javax/jakarta-Analyse, Container-Images, Performancevergleich und produktionsnahe Lasttests.

Typische Modernisierungsgewinne

Records reduzieren DTO-Boilerplate, sealed types machen Fehler- und Statusmodelle klarer, Pattern Matching vereinfacht Routinglogik und Virtual Threads können blockierende I/O-Workloads vereinfachen. Der Gewinn entsteht aber erst, wenn Code und Architektur darauf vorbereitet sind.

Entscheidungen

EntscheidungGute PraxisPrüffrage
Fachliche GrenzeZuerst Use Case, Invariante und Verantwortlichkeit klären.Welche Geschäftsentscheidung wird geschützt?
Technische GrenzeFramework-/Library-Code hinter Port, Adapter oder Konfiguration kapseln.Kann die Domain ohne Framework getestet werden?
BetriebTimeouts, Logs, Metriken, Traces, Security und Rollback definieren.Wie erkennt der Betrieb Fehler rechtzeitig?

Ausführliche Beispiele

Maven Toolchain plus release
<properties>
  <maven.compiler.release>21</maven.compiler.release>
</properties>

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-toolchains-plugin</artifactId>
      <version>3.2.0</version>
      <executions>
        <execution>
          <goals><goal>toolchain</goal></goals>
        </execution>
      </executions>
      <configuration>
        <toolchains>
          <jdk>
            <version>21</version>
            <vendor>any</vendor>
          </jdk>
        </toolchains>
      </configuration>
    </plugin>
  </plugins>
</build>
Sealed Fehlerbaum für Migration
public sealed interface MigrationRisk permits BuildRisk, RuntimeRisk, LibraryRisk {}

public record BuildRisk(String plugin, String reason) implements MigrationRisk {}
public record RuntimeRisk(String component, String reason) implements MigrationRisk {}
public record LibraryRisk(String dependency, String reason) implements MigrationRisk {}

public static String owner(MigrationRisk risk) {
    return switch (risk) {
        case BuildRisk ignored -> "Build/CI Team";
        case RuntimeRisk ignored -> "Platform Team";
        case LibraryRisk ignored -> "Application Team";
    };
}

Typische Stolperfallen

StolperfalleWarum gefährlich
Nur lokal kompilierenCI, Docker-Image und Runtime können trotzdem altes Verhalten haben.
javax/jakarta unterschätzenPackage-Wechsel betrifft Code, Libraries, Server und Tests.
Performance nicht vergleichenNeue Runtime kann andere GC-, TLS- oder Threading-Eigenschaften haben.
⌂ Cockpit