Zum Inhalt
Legacy-Systeme modernisieren, ohne blind zu fliegen
Bl. 34
2026
abgeschlossen

migration-lab

Ein öffentlich überprüfbarer Referenzfall für die kontrollierte Modernisierung geschäftskritischer Java-Anwendungen.

github.com/Stoicera/migration-lab-java →

Der modernisierte Zielstand — Java 25, Spring Boot 4.1 und Angular 22
Der modernisierte Zielstand — Java 25, Spring Boot 4.1 und Angular 22
Fachvideo · 11 Minuten

Modernisieren, ohne blind zu fliegen

Sebastian Kern zeigt, wie das Sicherheitsnetz aus Charakterisierungs- und End-to-End-Tests funktionale Äquivalenz über den gesamten Migrationspfad absichert.

Projektprofil

Viele Organisationen betreiben Fachanwendungen, die fachlich unverzichtbar, technisch aber über Jahre gewachsen sind. migration-lab zeigt an einem realitätsnahen Werkstatt-CRM, wie ein solcher Bestand schrittweise modernisiert wird, ohne Funktionsumfang und Datenverhalten still zu verändern. Der entscheidende Baustein ist kein Framework, sondern ein vorab aufgebautes Sicherheitsnetz, das den alten und den neuen Stand mit denselben Szenarien prüft.

6
nachvollziehbare Migrationsetappen
47/47
Charakterisierungstests je Stand
2
parallel betriebene Systemstände
Ausgangslage
Java 8 · Spring Boot 1.5.22 · AngularJS 1.8 · PostgreSQL 9.6 · ohne Tests
Zielbild
Java 25 · Spring Boot 4.1 · Angular 22 · PostgreSQL 18 · containerisiert und beobachtbar
Vorgehen
Sechs versionierte Etappen; jede Etappe als reproduzierbarer Git-Tag
Sicherheitsnetz
Charakterisierungstests, Selenium-End-to-End-Tests und CI-Gates gegen beide Systemstände
Betrieb
Zwei getrennte Live-Stände mit TLS, Health-Prüfungen, Backups und ausgeführter Wiederherstellungsprobe
Leistung
Legacy-Modernisierung, Qualitätssicherung und Betrieb
Stack
Java 8 → 25 · Spring Boot 1.5 → 4.1 · AngularJS → Angular 22 · PostgreSQL · Selenium · Docker

Leistungsumfang

  • Reproduzierbarer Legacy-Stand mit bewusst erhaltenen Altlasten als belastbare Ausgangsbasis
  • Sicherheitsnetz vor dem ersten Migrationsschritt: API- und Datenbankverhalten plus durchgängige Nutzungsabläufe
  • Schrittweiser Backend-Pfad von Spring Boot 1.5 über 2.7 und 3.5 auf 4.1 sowie Java 8 auf Java 25
  • Frontend-Modernisierung von AngularJS auf Angular 22 über eine kontrollierte Strangler-Fig-Architektur
  • Modernisierung von Datenbank, Schemaführung, Health-Prüfungen, Protokollierung und Observability
  • Vorab registriertes Experiment zur KI-gestützten Testgenerierung mit veröffentlichten Kosten, Fehlversuchen und Mutation Scores
  • CI/CD, containerisierte Live-Stände, TLS, Sicherung und dokumentierte Wiederherstellungsprobe
01

Das Sicherheitsnetz kommt vor der Modernisierung

Bei gewachsenen Fachanwendungen ist die Dokumentation selten vollständig. Deshalb wird der Soll-Zustand nicht aus Annahmen rekonstruiert: Charakterisierungstests halten das beobachtbare Verhalten von Schnittstellen und Datenbank fest, End-to-End-Tests sichern die tatsächlichen Arbeitsabläufe.

Dasselbe Netz läuft gegen Alt- und Zielstand. Ein Versionssprung gilt erst dann als abgeschlossen, wenn die definierten Abläufe auf beiden Seiten grün sind. So werden gerade jene Abweichungen sichtbar, die eine moderne Oberfläche allein nicht verrät.

02

Etappen statt Big Bang

Die Modernisierung ist in sechs überprüfbare Zustände gegliedert. Jeder Zustand ist als Git-Tag reproduzierbar und bringt einen lauffähigen Stand, dokumentierte Entscheidungen sowie die zugehörigen Prüfergebnisse mit.

Dieses Vorgehen reduziert organisatorisches Risiko: Fortschritt, verbleibende Abhängigkeiten und zulässige Abweichungen sind jederzeit benennbar. Für Auftraggeber entsteht eine belastbare Entscheidungsgrundlage statt eines mehrmonatigen Versprechens.

03

Offene Ergebnisse statt geschönter Kennzahlen

Das ergänzende KI-Testexperiment wurde vor dem ersten Lauf protokolliert. Die zunächst perfekten Kennzahlen stammten nur aus den Testklassen, die überhaupt kompilierten. Nach der Reparatur fielen sie auf 90,5 Prozent Zeilenabdeckung und 73,2 Prozent Mutation Score — ein messbarer Survivorship Bias.

Genau dieser Befund ist Teil des Kompetenznachweises: Werkzeuge werden nicht nach ihrem besten Screenshot bewertet, sondern nach reproduzierbaren Ergebnissen, Grenzen und dem Aufwand bis zu einem verlässlichen Stand.

Einblicke

2 Aufnahmen · seitlich ziehen

Leitentscheidungen

Wesentliche Entscheidungen, ihre naheliegenden Alternativen und die Gründe dahinter.

Funktionale Äquivalenz wird gegen beide laufenden Stände ausgeführt
statt Abnahme anhand einzelner Screenshots und manueller Stichproben

Oberflächen können identisch wirken, während Datenformate, Nebenwirkungen oder seltene Abläufe bereits abweichen. Das gemeinsame Sicherheitsnetz macht diese Unterschiede vor der Auslieferung sichtbar.

Migration in klar abgegrenzten, ausführbaren Etappen
statt gleichzeitiger Austausch von Backend, Frontend, Datenbank und Betrieb

Kleine, nachweisbare Zustände begrenzen die Fehlerursache, halten den Fortschritt überprüfbar und erlauben belastbare Freigaben je Etappe.

AngularJS wird über eine URL-Grenze schrittweise abgelöst
statt Hybridbetrieb mit ngUpgrade im selben Frontend

Die klare Grenze hält Alt- und Neusystem organisatorisch wie technisch trennbar und reduziert die Kopplung während der Übergangsphase.

Sicherheitsrelevante Abweichungen werden ausdrücklich registriert
statt absolute Gleichheit auch für bekannt unsicheres Verhalten

Eine behobene SQL-Injection darf nicht als unerwarteter Testbruch erscheinen. Zulässige Abweichungen werden entschieden, dokumentiert und für beide Stände separat geprüft.

Nachweise

Migrationsetappen
6 / 6 abgeschlossen
Charakterisierungstests
47 / 47 je Stand
End-to-End-Szenarien
34 gegen Alt und Neu
Zielstack
Java 25 · Boot 4.1 · Angular 22
KI-Testexperiment
24 Aufrufe · 0,65 €
Übernommene generierte Tests
88 Methoden
Abdeckung im Zielstand
37 % → 81 %
Wiederherstellungsprobe
ausgeführt

Stand Release v1.0.0. Alle Werte stammen aus den versionierten Worklogs, ADRs, CI-Konfigurationen und Messberichten des öffentlichen Repositorys. Die KI-Messung folgt einem vorab eingefrorenen Protokoll; Einschränkungen und nicht übertragbare Zeitangaben sind dort ausdrücklich dokumentiert.