#Orientierung, Zielbild und Lernstrategie
Dieses Kapitel erklärt, wie du den Lernpfad liest, welches Zielbild hinter der Modernisierung steht und wie du als Senior Java Entwickler priorisieren solltest.
#Leitgedanke
Bei Legacy Java Enterprise reicht es nicht, Klassen zu lesen. Du musst Container-Verhalten lesen:
- Welche Transaktion läuft?
- Welcher Proxy ruft die Methode auf?
- Ist der Call lokal, remote, synchron oder asynchron?
- Welche Ressourcen werden per JNDI injected?
- Welche DB-, JMS-, SOAP- und File-Side-Effects passieren?
- Was passiert bei Exception, Timeout, Retry, Rollback oder Redelivery?
Die wichtigste Reihenfolge lautet:
Dokumentieren
↓
Absichern
↓
Kapseln
↓
Extrahieren
↓
Ersetzen
Nicht umgekehrt.
#Gesamtziel des Lernpfads
Am Ende sollst du:
- Ein altes Java-Enterprise-System strukturiert inventarisieren können.
- EJB-, JTA-, JMS-, SOAP-, JSP- und JPA-Laufzeitverhalten erklären können.
- Kritische Use Cases vom Entry Point bis zur Datenbank verfolgen können.
- Transaktionsgrenzen, Side Effects, Rollback-Regeln und Retry-Verhalten dokumentieren können.
- Charakterisierungstests und Smoke Tests für Legacy-Verhalten bauen können.
- Komponenten hinter Ports/Adapter kapseln können.
- EJBs zu dünnen Fassaden umbauen können.
- SOAP/JMS/JPA/JNDI-Abhängigkeiten vom fachlichen Kern trennen können.
- Eine realistische Modernisierungsstrategie Richtung Jakarta EE, Spring Boot oder Quarkus entwickeln können.
- Einen schrittweisen Migrationsplan ohne Big Bang erstellen können.
#Zielarchitektur als Orientierung
Nicht sofort Framework wechseln. Erst eine saubere innere Struktur schaffen.
Inbound Adapter
JSP / Servlet / SOAP / JMS / Scheduler / REST
↓
Application Services / Use Cases
Transaktionsgrenzen, Orchestrierung, Commands
↓
Domain
Fachregeln, Statusübergänge, Invarianten
↓
Ports
Repository, EventPublisher, PaymentGateway, AuditPort
↓
Outbound Adapter
JPA, JDBC, SOAP Client, JMS, File, Mail, JNDI
Kurzform:
Außen darf alt bleiben.
Innen soll sauber werden.
#Zielplattformen: Jakarta EE, Spring Boot, Quarkus
#Jakarta EE modernisieren
Geeignet, wenn:
- viele EJBs, JTA, JMS, JPA und Application-Server-Features vorhanden sind
- XA-Transaktionen wichtig sind
- Container Security genutzt wird
- Remote EJBs, MDBs oder Timer stark genutzt werden
- das Team Java EE/Jakarta EE kennt
- möglichst wenig Architekturbruch gewünscht ist
Typische Richtung:
Java EE 6/7/8
↓
Build stabilisieren
↓
Java 11/17 vorbereiten
↓
Java EE 8 kompatibel machen
↓
javax.* → jakarta.* prüfen
↓
Jakarta EE 10/11 Runtime
↓
EJB-Fachlogik reduzieren, CDI/Application Services stärken
#Spring Boot
Geeignet, wenn:
- Application Server abgelöst werden soll
- eigenständige Deployables gewünscht sind
- Team Spring kennt
- REST/APIs, einfache Container Deployments oder modulare Services geplant sind
- EJBs hauptsächlich normale Services sind
Typisches Mapping:
@Stateless → @Service
@TransactionAttribute → @Transactional
@PersistenceContext → EntityManager / Spring Data / Repository
@MessageDriven → @JmsListener
@WebService → SOAP Adapter oder REST Controller
@Resource → Spring Bean / ConfigurationProperties
JNDI Datasource → konfigurierte DataSource
Achtung: EJB-Transaktionen und Spring-Transaktionen sind ähnlich, aber nicht identisch. Prüfe besonders:
- checked Exceptions
- Rollback-Regeln
- REQUIRES_NEW
- NOT_SUPPORTED
- Self-invocation
- Proxy-Verhalten
- Security Context
- Remote Calls
- Interceptors
#Quarkus
Geeignet, wenn:
- Kubernetes/Container wichtig sind
- schnelle Startzeit und niedriger Speicherverbrauch wichtig sind
- Jakarta/MicroProfile-nahe Entwicklung gewünscht ist
- Services kleiner geschnitten werden sollen
- Native Image oder Cloud-native Java relevant ist
Typische Richtung:
Legacy Monolith
↓
Use Cases und Ports extrahieren
↓
einzelne fachliche Slices als Quarkus Services neu anbinden
↓
Legacy per Adapter/Events/Schnittstellen integrieren
#Master-Roadmap
#Phase A: Sichtbarkeit schaffen
Ziel: Wissen, was existiert.
Dauer: 1–2 Wochen
Ergebnisse:
docs/legacy-inventory.mddocs/entry-points.mddocs/runtime-resources.mddocs/deployment-structure.md- erste Liste kritischer Use Cases
#Phase B: Laufzeitverhalten verstehen
Ziel: Wissen, was wirklich passiert.
Dauer: 2–4 Wochen
Ergebnisse:
- Call Chains
- Transaction Maps
- Queue Maps
- SOAP Contract Maps
- Security Map
- Exception/Rollback Matrix
#Phase C: Schutznetz bauen
Ziel: Änderungen absichern.
Dauer: 2–4 Wochen
Ergebnisse:
- Smoke Tests
- Charakterisierungstests
- SOAP Golden Master Tests
- JMS Handler Tests
- DB Integration Tests
- Logging/Correlation IDs
#Phase D: Kapseln und entkoppeln
Ziel: Fachlogik aus Container-/Framework-Code lösen.
Dauer: 4–12 Wochen, iterativ
Ergebnisse:
- Ports/Adapter
- dünne EJB-Fassaden
- extrahierte Use Cases
- Plain-Java-Fachlogik
- SOAP/JMS/JPA/JNDI hinter Interfaces
#Phase E: Modernisieren
Ziel: Technologie gezielt ersetzen.
Dauer: projektabhängig
Mögliche Ergebnisse:
- Java-Version modernisiert
- Build modernisiert
- Application Server aktualisiert oder ersetzt
- Jakarta EE Migration
- Spring Boot/Quarkus Slices
- JSP reduziert oder abgelöst
- Outbox Pattern statt XA/JMS-Kopplung
- Legacy-Module entfernt
#30-Tage-Lern- und Arbeitsplan
#Woche 1: System sichtbar machen
Ziele:
- Build reproduzierbar machen
- Deployment verstehen
- EJB/MDB/SOAP/JSP Inventar erstellen
- Runtime Resources dokumentieren
- 1 kritischen Use Case auswählen
Deliverables:
docs/legacy-inventory.md
docs/entry-points.md
docs/runtime-resources.md
docs/deployment-structure.md
#Woche 2: Verhalten verstehen
Ziele:
- Call Chain eines Use Cases dokumentieren
- Transaktionsgrenzen markieren
- DB-Schreibzugriffe markieren
- JMS/SOAP Side Effects markieren
- Fehlerfälle prüfen
Deliverables:
docs/use-case-001.md
docs/transaction-map-001.md
docs/queue-map.md
docs/soap-map.md
#Woche 3: Schutznetz bauen
Ziele:
- Smoke Test
- Charakterisierungstest
- SOAP Golden Master
- JMS Handler Test
- DB Integration Test
- erste Observability-Verbesserung
Deliverables:
src/test/...
docs/test-strategy.md
docs/manual-test-script.md
#Woche 4: Erste Kapselung
Ziele:
- eine SOAP-Abhängigkeit hinter Interface ziehen
- einen JMS Publisher hinter Interface ziehen
- eine EJB-Fachlogik in Plain Java Use Case ziehen
- eine JSP von direkter Businesslogik befreien
- Risiko-Backlog aktualisieren
Deliverables:
application/<UseCase>.java
ports/*.java
adapters/*.java
docs/modernization-candidate-001.md
docs/risk-backlog.md
#60-Tage-Plan
#Tage 31–45
- 3–5 zentrale Use Cases analysieren
- Transaktionsmatrix vervollständigen
- Queue- und SOAP-Katalog vervollständigen
- Security Map erstellen
- JNDI zentralisieren
- erste EJB-Fassaden dünner machen
#Tage 46–60
- automatisierte Regression für Haupt-Use-Cases
- Outbox-Kandidaten identifizieren
- nicht-idempotente MDBs absichern
- erste technische Spike-Migration:
- Jakarta EE Runtime
- Spring Boot Slice
- Quarkus Slice
- Entscheidungsvorlage für Zielplattform erstellen
#90-Tage-Plan
#Tage 61–75
- Java-Version-Upgrade prüfen
- Dependencies auditieren
- Build modernisieren
- Deployment pipeline stabilisieren
- Observability ausbauen
- zentrale Adapter fertigstellen
#Tage 76–90
- erstes produktionsnahes Modernisierungs-Slice
- Legacy-Fassade + neuer Kern
- Rollback-Plan
- Performance-Vergleich
- Betriebsdokumentation
- Roadmap für weitere Slices
#Prioritätenliste für dich als Senior Java Entwickler
- JTA und EJB Transaction Semantics
- EJB Lifecycle, Proxies und Interceptors
- JMS, MDB, Redelivery und Idempotenz
- SOAP/WSDL/XSD/JAXB und Contract Tests
- JPA im Container
- JNDI, Datasources und Classloading
- JSP/Servlet/Session/Security
- Build, EAR/WAR/EJB-JAR, App Server
- Charakterisierungstests und Golden Master
- Ports/Adapter und Use-Case-Extraktion
- Jakarta/Spring/Quarkus Zielplattform
- Outbox, Events und schrittweise Entkopplung
#Was du nicht zuerst tun solltest
Nicht zuerst:
- alle EJBs löschen
- sofort Spring Boot draus machen
javax.*blind nachjakarta.*ersetzen- JSP durch React ersetzen
- DB-Schema groß umbauen
- SOAP-Verträge ändern
- Queue-Namen ändern
- Transaktionsattribute ändern
- REQUIRES_NEW entfernen
- XA abschalten
- Microservices schneiden
Erst verstehen, testen und kapseln.
#Lernressourcen und Referenzen
Offizielle / primäre Referenzpunkte:
- Jakarta EE 11 Platform: https://jakarta.ee/specifications/platform/11/
- Jakarta EE 11 Release: https://jakarta.ee/release/11/
- Spring Boot Reference Documentation: https://docs.spring.io/spring-boot/
- Spring Boot System Requirements: https://docs.spring.io/spring-boot/system-requirements.html
- Quarkus: https://quarkus.io/
- Quarkus Guides: https://quarkus.io/guides/
- OpenRewrite Java Migration Recipes: https://docs.openrewrite.org/recipes/java/migrate
- OpenRewrite Upgrade to Java 17: https://docs.openrewrite.org/recipes/java/migrate/upgradetojava17
- OpenRewrite Upgrade to Java 21: https://docs.openrewrite.org/recipes/java/migrate/upgradetojava21
- Eclipse Transformer: https://projects.eclipse.org/projects/technology.transformer
- Tomcat Jakarta EE Migration Tool: https://github.com/apache/tomcat-jakartaee-migration
#Merksätze
Modernisierung ist kein Rewrite.
Modernisierung ist kontrollierte Risikoreduktion.
EJB ist nicht nur eine alte Service-Klasse.
EJB ist oft Transaktion, Security, Pooling, Remoting und Lifecycle.
SOAP ist nicht nur altes XML.
SOAP ist oft ein Vertrag.
JMS ist nicht nur Queue-Technik.
JMS ist oft ein versteckter Workflow.
JSP ist nicht nur View.
JSP enthält in Legacy-Systemen oft Businesslogik.
Transaktionen sind fachliche Grenzen.
Nicht nur technische Annotationen.
Der erste gute Schritt ist fast immer:
Interface einführen, Adapter bauen, Verhalten testen.
#Abschlussziel
Nach diesem Lernpfad solltest du für jeden wichtigen Use Case sagen können:
Dieser Use Case startet hier.
Diese Klassen sind beteiligt.
Diese Transaktion läuft.
Diese Tabellen werden geschrieben.
Diese Messages werden gesendet.
Diese externen Calls passieren.
Diese Fehler führen zu Rollback.
Diese Fehler führen zu Retry.
Diese Komponente kann ich kapseln.
Diese Komponente darf ich noch nicht anfassen.
Das ist der sichere nächste Modernisierungsschritt.
Wenn du das kannst, bist du bereit, das Legacy-System nicht nur zu verstehen, sondern strategisch zu modernisieren.