#Projektinventur, Reverse Engineering und Entry Points
Dieses Kapitel zeigt, wie du ein altes Enterprise-Java-Projekt sichtbar machst, bevor du Code änderst.
#Phase A: Legacy Inventory
Erstelle:
docs/legacy-inventory.md
Vorlage:
# Legacy Inventory
## Runtime
- Java Version:
- Application Server:
- Java EE / Jakarta EE Version:
- Build Tool:
- Packaging:
- Deployment Target:
- Betriebssystem / Container:
- Datenbank:
- JMS Provider:
- SOAP Stack:
- JPA Provider:
## Modules
| Modul | Typ | Zweck | Artefakt |
|---|---|---|---|
| legacy-web | WAR | JSP/Servlet UI | legacy-web.war |
| legacy-ejb | EJB-JAR | Business Services | legacy-ejb.jar |
| legacy-ear | EAR | Deployment | legacy.ear |
## External Systems
| System | Typ | Richtung | Zweck | Kritisch |
|---|---|---|---|---|
| PaymentProvider | SOAP | Outbound | Zahlung | ja |
| ERP | SOAP | Inbound/Outbound | Stammdaten | ja |
| OrderQueue | JMS | Async | Bestellverarbeitung | ja |
## Persistence
- Datasources:
- XA enabled:
- Persistence Units:
- wichtige Tabellen:
- Stored Procedures:
- Trigger:
- Views:
## Deployment
- EAR/WAR/JAR Struktur:
- Server Config:
- JNDI Ressourcen:
- Environment-spezifische Properties:
#Code-Suchliste
Starte mit diesen Suchbegriffen:
@Stateless
@Stateful
@Singleton
@MessageDriven
@TransactionAttribute
TransactionAttributeType
@Resource
@EJB
@PersistenceContext
@PersistenceUnit
InitialContext
UserTransaction
SessionContext
setRollbackOnly
@WebService
@WebMethod
@WebServiceRef
SOAPFaultException
BindingProvider
@SOAPBinding
@WebServlet
@WebFilter
HttpSession
request.getParameter
session.getAttribute
.jsp
@Schedule
@Timeout
TimerService
@RolesAllowed
@PermitAll
@DenyAll
isUserInRole
getCallerPrincipal
Gruppiere Treffer in:
1. EJB Services
2. Message Driven Beans
3. SOAP Endpoints
4. SOAP Clients
5. Transaktionen
6. JPA/JDBC/DAO
7. JSP/Servlet UI
8. Security
9. Scheduler/Timer/Batch
10. JNDI/Runtime Resources
#Entry-Point-Katalog
Erstelle:
docs/entry-points.md
Vorlage:
# Entry Points
## Web / JSP / Servlet
| URL / JSP | Servlet / Controller | Zweck | Session? | Risiko |
|---|---|---|---|---|
| /order/create.jsp | OrderServlet | Bestellung anlegen | ja | hoch |
## SOAP Inbound
| Service | Klasse | Operation | WSDL | Aufrufer | Risiko |
|---|---|---|---|---|---|
| CustomerService | CustomerEndpoint | updateCustomer | customer.wsdl | CRM | hoch |
## JMS Consumers
| Queue / Topic | MDB | Message Type | Zweck | Risiko |
|---|---|---|---|---|
| OrderCreatedQueue | InvoiceMDB | XML/ObjectMessage | Rechnung erzeugen | hoch |
## Timer / Batch
| Job | Klasse | Frequenz | Zweck | Risiko |
|---|---|---|---|---|
| NightlyBillingJob | BillingTimerBean | täglich 02:00 | Abrechnung | hoch |
## Remote EJB
| Interface | Bean | Aufrufer | Zweck | Risiko |
|---|---|---|---|---|
| OrderServiceRemote | OrderServiceBean | externes Modul | Bestellung | hoch |
#JNDI und Runtime Resources
#Was du erfassen musst
- Datasources
- XA Datasources
- JMS ConnectionFactories
- Queues
- Topics
- Mail Sessions
- EJB JNDI Names
- Environment Entries
- Server-spezifische Deployment Descriptors
#Runtime Resources Vorlage
# Runtime Resources
## Datasources
| JNDI Name | DB | XA? | Genutzt von |
|---|---|---|---|
| java:/jdbc/OrderDS | orderdb | ja | orderPU |
## JMS
| JNDI Name | Typ | Genutzt von |
|---|---|---|
| java:/jms/queue/OrderCreatedQueue | Queue | OrderEventProducer, InvoiceMDB |
## EJB Lookups
| JNDI Name | Interface | Genutzt von |
|---|---|---|
| java:global/app/OrderServiceBean | OrderServiceRemote | JSP, Batch |
Regel:
JNDI nicht überall direkt nutzen.
JNDI über zentrale Adapter/Fabriken kapseln.
#Deployment und Build
#Was du verstehen musst
- EAR
- WAR
- EJB-JAR
- shared
lib/ application.xmlweb.xmlejb-jar.xmlpersistence.xml- Server-spezifische Deskriptoren
- Maven/Ant/Gradle
- interne Repositories
- App-Server Libraries
- Classloader-Grenzen
- Dependency-Konflikte
#Deployment-Struktur
# Deployment Structure
| Artifact | Typ | Inhalt | Abhängigkeiten |
|---|---|---|---|
| legacy-web.war | WAR | JSP/Servlet | legacy-ejb.jar |
| legacy-ejb.jar | EJB-JAR | Business Beans | legacy-core.jar |
| legacy-core.jar | JAR | Domain/DTO/Util | shared |
| legacy-soap.war | WAR | SOAP Endpoints | legacy-ejb.jar |
Typische Risiken:
- gleiche Library in WAR und EAR/lib
- JAXB-/JAX-WS-Versionen kollidieren
- Server bringt eigene APIs mit
- ClassCastException wegen Classloader
- alte vendor clients
- manuelle Deployment-Schritte
#Beispiel: kompletter Use-Case-Slice
createOrder.jsp
↓
OrderServlet#doPost
↓
OrderServiceBean#createOrder
↓
CreateOrderUseCase#execute
↓
OrderRepository#save
↓
AuditPort#orderCreated
↓
OrderEventPublisher#publishOrderCreated
↓
OrderCreatedQueue
↓
InvoiceMDB#onMessage
↓
InvoiceMessageHandler#handle
↓
CreateInvoiceUseCase#execute
Dokumentation:
# Use Case: Bestellung anlegen
## Entry Point
- JSP:
- Servlet:
- SOAP:
- JMS:
- Scheduler:
## Call Chain
| Schritt | Klasse | Methode | Technologie | Side Effect |
|---|---|---|---|---|
## Transaction
| Klasse | Methode | TX Attribute | Bemerkung |
|---|---|---|---|
## Database
| Tabelle | Operation | Klasse | Risiko |
|---|---|---|---|
## Messaging
| Queue | Producer | Consumer | Message Type | Retry |
|---|---|---|---|---|
## SOAP
| Service | Richtung | Methode | Timeout | Risiko |
|---|---|---|---|---|
## Fehlerfälle
| Fehler | Rollback? | Retry? | Aktion |
|---|---|---|---|
## Modernisierungsstrategie
- KEEP:
- WRAP:
- EXTRACT:
- REPLACE:
- Risiken:
#Risiko-Backlog Vorlage
# Risk Backlog
| Thema | Risiko | Auswirkung | Modernisierungsaktion | Priorität |
|---|---|---|---|---|
| Payment SOAP in TX | hoch | Deadlocks/Inkonsistenz | Timeout + Adapter + Outbox prüfen | P1 |
| InvoiceMDB nicht idempotent | hoch | doppelte Rechnungen | Idempotency Key einführen | P1 |
| createOrder.jsp enthält Logik | mittel | UI schwer ersetzbar | Logik in Service extrahieren | P2 |
| Audit REQUIRES_NEW | hoch | Semantik kritisch | Verhalten testen/dokumentieren | P1 |
| JNDI Lookups überall | mittel | schwer migrierbar | zentrale Adapter/Fassade | P2 |