35
Wir müssen migrieren! Was nun? Jens Schumann open knowledge GmbH

Wir müssen migrieren! Was nun?

Embed Size (px)

DESCRIPTION

Speaker: Jens Schumann 5. November 2013 | JAX Mainz Viele ältere Java- und Java-EE-Anwendungen haben mittlerweile ihre Halbwertszeit überschritten: Neben den klassischen Problemfeldern Wartbarkeit, Entwicklungsgeschwindigkeit oder verfügbarer Support sprechen aktuelle Java- und Java-EE-Plattformentscheidungen für eine Migration bestehender Anwendungen hin zu einem neueren Technologie-Stack. Doch was bei einer kleinen Anwendung mithilfe von etwas Fleißarbeit erledigt werden kann, entpuppt sich bei großen, über viele Jahre gewachsenen Anwendungen schnell als unlösbare Aufgabe. Glücklicherweise bietet die Java-Community einige Tools und Ideen, mit deren Hilfe Technologiemigrationen vorab besser bewertet und teilweise bis vollständig automatisch realisiert werden können. Diese Session schildert Erfahrungen mit diesen Ansätzen und Tools und zeigt auf, wie serverseitige Migrationen (Komponentenmodell, Datenzugriff ...), aber auch GUI-Migrationen, beispielsweise von Swing zu JavaFX oder Webtechnologien, gemeistert werden können.

Citation preview

Page 1: Wir müssen migrieren! Was nun?

Wir müssen migrieren! Was nun?

Jens Schumann open knowledge GmbH

Page 2: Wir müssen migrieren! Was nun?

CMP / BMP!

Struts und Verwandte!Swing!

Stateless/Stateful EJB 2.x!J2EE Pattern!

YOUR-APP-Framework!YOUR-DB-Framework!

JSF 1.x!

Unsere Landschaft

Page 3: Wir müssen migrieren! Was nun?

Wir müssen migrieren!

Page 4: Wir müssen migrieren! Was nun?

Warum? •  Plattform-Support •  Entwicklungsperformance

•  Know-How •  Funktionsumfang

•  Komplexität, Performance, Integration, ...

•  Sex Appeal

Page 5: Wir müssen migrieren! Was nun?

Wohin? •  Java Server-Side –  Java EE Stack –  Spring Framework

•  Java Client-Side –  Java FX –  Web

Page 6: Wir müssen migrieren! Was nun?

Wohin? •  Beispiel: Java EE Stack

JSF 2.x CDI 1.x

CDI 1.x EJB 3.x

JPA 2.x

Page 7: Wir müssen migrieren! Was nun?

Wohin? •  Beispiel: Java EE Stack

JAX-WS CDI 1.x

CDI 1.x EJB 3.x

JAX-WS

Page 8: Wir müssen migrieren! Was nun?

Wohin? •  Beispiel: Java EE Stack

JAX-RS CDI 1.x

CDI 1.x EJB 3.x

JAX-RS

Page 9: Wir müssen migrieren! Was nun?

Ja aber!

•  Lines of Code •  Complexity

•  Changes

•  Team Staffing •  Development Process

•  Testing

Page 10: Wir müssen migrieren! Was nun?

Migrations Ansätze

•  Vollständig –  All-or-nothing

•  Schichtenorientiert –  Layer-by-layer –  Layer-only

•  Modulorientiert

–  Domain or technical

Page 11: Wir müssen migrieren! Was nun?

•  Manuell –  Rewrite by hand

•  Vollautomatisiert –  Refactoring

•  Teilautomatisiert –  Refactoring & Cleanup

Migrations Ansätze

Page 12: Wir müssen migrieren! Was nun?

•  Das Toolset ist vorhanden –  Eclipse JDT

–  IntelliJ Idea PSI

–  NetBeans Refactoring API Auto

matisierung

Page 13: Wir müssen migrieren! Was nun?

•  Das Toolset ist vorhanden –  Rewrite Code –  Rewrite Invocations –  Rewrite Failure Handling

–  Introduce Code –  Move Code –  Remove Code

–  Move Config

Auto matisierung

Page 14: Wir müssen migrieren! Was nun?

•  Beispiel JDT Refactoring –  Zugriff auf Abstract Syntax Tree –  Programmiermodell entspricht

GUI Verhalten: 2 Phasen •  Änderungen aufzeichnen

o.e.j.c.d.r.ASTRewrite o.e.j.c.d.r.ImportRewrite o.e.j.c.d.AST (Factory)

•  Änderungen anwenden o.e.j.t.Document o.e.t.e.TextEdit o.e.j.c.IBuffer (falls „auto-commit“)

Auto matisierung

Page 15: Wir müssen migrieren! Was nun?

•  Beispiel

–  Migration von EJB 2.x Stateless/Stateful Beans und Pattern zu Java EE 6/7 (CDI, EJB 3.x)

–  Beispiel: PetStore 1.3.2 Auto matisierung

Page 16: Wir müssen migrieren! Was nun?

EJB Transformation (1/5) public class CartEJBAction extends EJBActionSupport { public EventResponse perform(Event e) throws …{ CartEvent ce = (CartEvent)e; ShoppingClientFacadeLocal scf = (SCFL)machine.getAttribute(…); ShoppingCartLocal cart = scf.getShoppingCart(); switch (ce.getActionType()) { case CartEvent.ADD_ITEM : { cart.addItem(ce.getItemId()); } … } } }

Page 17: Wir müssen migrieren! Was nun?

EJB Transformation (2/5) public class ShoppingClientFacadeLocalEJB implements SessionBean { public ShoppingCartLocal getShoppingCart() { if (cart == null) { try { ServiceLocator sl = new ServiceLocator(); ShoppingCartLocalHome home =(SCLH)sl.getLocalHome(...); cart = home.create(); } catch (javax.ejb.CreateException cx) { ... } catch (ServiceLocatorException slx) { ...} } return cart; } }

Page 18: Wir müssen migrieren! Was nun?

EJB Transformation (3/5) public class ShoppingCartLocalEJB implements SessionBean { private HashMap cart; // default to the US English private Locale locale = Locale.US; public ShoppingCartLocalEJB() { cart = new HashMap(); } ... }

Page 19: Wir müssen migrieren! Was nun?

EJB Transformation (4/5) @Named @SessionScoped public class CartAction extends ActionSupport { @Inject privat ShoppingCart cart; public EventResponse perform(Event e) throws …{ CartEvent ce = (CartEvent)e; switch (ce.getActionType()) { case CartEvent.ADD_ITEM : { cart.addItem(ce.getItemId()); } … } } }

Page 20: Wir müssen migrieren! Was nun?

EJB Transformation (5/5) @Stateful public class ShoppingCart { private HashMap cart; // default to the US English private Locale locale = Locale.US; public ShoppingCart() { cart = new HashMap(); } ... }

Page 21: Wir müssen migrieren! Was nun?

•  Beispiel

–  Swing UI Layout Migration nach JSF 2.x

–  Migrationspfad •  Swing -> XMLEncoder ->

XSLT -> XHTML Auto matisierung

Page 22: Wir müssen migrieren! Was nun?

Swing Layout Migration (1/3) <java version=“..." class="java.beans.XMLDecoder"> ... <object class=“javax.swing.JPanel"> <void method="add"> ... continued ... </void> <object> </java>

Page 23: Wir müssen migrieren! Was nun?

Swing Layout Migration (1/3) <object class=“c.j.m.FormComponent"> <string>javax.swing.JComboBox</string> <void method="setProperty"> <string>name</string> <string>Kunde</string> </void> <void method="setProperty"> <string>nextFocusableComponent</string> <object class=„xxxx.FormReference"> <string>Profil</string> </object> </void> <void property="name"> <string>Kunde</string> </void> </object>

Page 24: Wir müssen migrieren! Was nun?

Swing Layout Migration (3/3) <!DOCTYPE html PUBLIC ...> <html xmlns="http://www.w3.org/1999/xhtml" ...> <h:body> <ui:composition template="/templates/master.xhtml"> <div> <h:outputLabel for="Kunde" value="Kunde" /> <h:selectOneMenu id="Kunde" value="#{backingBean.name}" /> .... </div> </ui:composition> </h:body> </html>

Page 25: Wir müssen migrieren! Was nun?

Was? •  Bestandaufnahme –  (Veraltete) Technologien –  (Veraltete) Muster –  Unnötige Infrastruktur –  Fehlende Abstraktionen –  Over-engineering –  Architektonische Fehler –  Assets

•  Domain •  Data Access •  Business Logik •  UI

Page 26: Wir müssen migrieren! Was nun?

•  Achtung –  Manuelle Bestands-

aufnahme fehleranfällig

•  Daher –  Toolsupport nutzen

–  Beispiel •  JBoss Windup

Was?

Page 27: Wir müssen migrieren! Was nun?

JBoss Windup •  High Level Architektur

Analyse –  „Problem Spots“

•  Focus –  Technologien –  Muster –  Konfigurationen

–  JBoss Migrationen

Page 28: Wir müssen migrieren! Was nun?

JBoss Windup •  Core Features

–  Java Klassifikation –  XML Klassifikation

–  JBoss Migration Rules –  Rule Extension

–  Reporting

Page 29: Wir müssen migrieren! Was nun?

Wie?

•  Discover problem spots •  Design alternatives •  Implement

–  New core features –  Refactorings –  Transformations

•  Automate migration •  Test and improve •  Freeze and Test •  Rollout

Page 30: Wir müssen migrieren! Was nun?

Wie?

•  Java2Java –  Refactoring

•  Web2Web –  (Begrenzt) XSLT

•  SwingToXXX –  Layout und „Binding“ via

XMLDecoder und XSLT –  Refactoring

•  Java2XXX –  Refactoring & Code

Generierung

Page 31: Wir müssen migrieren! Was nun?

Problem Bereiche

•  Fehlendes Domain Modell

•  Fehlende Muster

•  DB Layer/ OR-Mapping –  Fehlende JPA Features –  Lebenszyklus –  Stateful Handling

•  (UI)-Framework pollution –  Domain und UI Code

•  View Logik

Page 32: Wir müssen migrieren! Was nun?

•  Upgrade EJB 2.x –  EJB 3.x, CDI oder Spring

•  Remove J2EE Pattern –  Injection

•  Remove/Simplify YOUR Framework

•  Re-use CMP –  Nur Basis für weiter-

führende Arbeiten •  Swing2JavaFX •  Swing2JSF

Was geht?

Page 33: Wir müssen migrieren! Was nun?

Vielen Dank für Ihre Zeit. Kontakt: open knowledge GmbH Bismarckstr. 13 26122 Oldenburg

Q&A

Page 34: Wir müssen migrieren! Was nun?

openknowledge@WJAX2013

Dienstag: Java EE Day 12:00 – 13:00 New School Enterprise Architecture 17:45 – 18:45 Wir müssen migrieren! Was nun?

Donnerstag: 08:45 – 09:45 Android goes asynchronous 10:15 – 11:15 JS-Components in JSF-Anwendungen

Freitag: Java EE Experts Day 13:30 – 15:00 JPA: Pitfalls, Patterns und Performance 15:30 – 17:00 Real-Life-Chaos und Best Practices

Page 35: Wir müssen migrieren! Was nun?

Links •  http://www.vogella.com/articles/EclipseJDT/article.html •  http://www.eclipse.org/articles/article.php?file=Article-Unleashing-the-

Power-of-Refactoring/index.html •  http://www.eclipse.org/articles/article.php?file=Article-

JavaCodeManipulation_AST/index.html •  http://publib.boulder.ibm.com/infocenter/rtnlhelp/v6r0m0/index.jsp?

topic=%2Forg.eclipse.jdt.doc.isv%2Fguide%2Fjdt_api_manip.htm