Java 21/25 Migration Roadmap
Von Java 8/11/17 zu Java 21/25: Sprache, Build, Runtime, Libraries, Container und Tests sicher modernisieren.
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
| Entscheidung | Gute Praxis | Prüffrage |
|---|---|---|
| Fachliche Grenze | Zuerst Use Case, Invariante und Verantwortlichkeit klären. | Welche Geschäftsentscheidung wird geschützt? |
| Technische Grenze | Framework-/Library-Code hinter Port, Adapter oder Konfiguration kapseln. | Kann die Domain ohne Framework getestet werden? |
| Betrieb | Timeouts, Logs, Metriken, Traces, Security und Rollback definieren. | Wie erkennt der Betrieb Fehler rechtzeitig? |
Ausführliche Beispiele
<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>
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
| Stolperfalle | Warum gefährlich |
|---|---|
| Nur lokal kompilieren | CI, Docker-Image und Runtime können trotzdem altes Verhalten haben. |
| javax/jakarta unterschätzen | Package-Wechsel betrifft Code, Libraries, Server und Tests. |
| Performance nicht vergleichen | Neue Runtime kann andere GC-, TLS- oder Threading-Eigenschaften haben. |