Restrukturierung der Code-Basis mit Java 9 (HH)

Restrukturierung der Code-Basis mit Java 9 (HH)

code.talks, Hamburg

363cf27411356afc37199a73bb58bcfe?s=128

Rabea Gransberger

September 29, 2017
Tweet

Transcript

  1. Restrukturierung der Code- Basis mit Java 9 Rabea Gransberger (MEKO-S

    GmbH) @rgransberger
  2. Rabea Gransberger • Diplom Informatik 2008 • Entwicklerin, Projekt- und

    Abteilungsleitung bei MEKO-S GmbH, Bremen • Projekt-Basis eclipse Technologie (RCP, RAP) • Code Reviews toolunterstützt in allen Projekten • Vorträge auf Konferenzen • Organisationsteam JUG Bremen, JavaLand, JCrete 29.09.2017 3 code.talks / Modularisierung (Rabea Gransberger @rgransberger)
  3. Java 9 - Überblick • Release: 21.09.2017, Neue Versionsnummern, neue

    Struktur (Module) • Multi-Release Jars: Andere Klassen für Java 10 als Java 9 • REPL • Kleinere Sprachänderungen: • Private Methoden in Interfaces • Arm ohne Variable try(inputStream) {} • Diamond on anonymous class: List<String> x = new ArrayList<>() { …. }; • _ als Variablenname nicht mehr erlaubt https://de.slideshare.net/SimonRitter/55-new-features-in-jdk-9 29.09.2017 4 code.talks / Modularisierung (Rabea Gransberger @rgransberger)
  4. Java 9 - Überblick • API Änderungen: • Collection Factory

    Methods: List.of(„A“,“B“,“C“) Map.of(„A“,1,“AA“,2) • Optional.stream/ifPresentOrElse/or • Stream.dropWhile/takeWhile/iterate/ofNullable • Process.pid/children/onExit usw • Reactive Streams API: Flow (ohne Implementierung) • Stackwalking API: StackWalker.getInstance().walk(….) https://gunnarmorling.github.io/jdkapidiff/jdk8-jdk9-api-diff.html 29.09.2017 5 code.talks / Modularisierung (Rabea Gransberger @rgransberger)
  5. Java 9 Platform Module System (JPMS) JSR 376: 25. Nov

    2014 • Reliable configuration: Ersetzen des ClassPath (-Hell) • Strong encapsulation: public != Public • Scalable Java SE Platform (JEP 200: Modular JDK) • Greater platform integrity: illegal-access für interne API • Improved performance: Keine linearen scans mehr 29.09.2017 6 code.talks / Modularisierung (Rabea Gransberger @rgransberger)
  6. Java 8 Code • Aufteilung in Packages • Aufteilung in

    Jars • Classloader ignoriert Jars: Kein Dependency Graph • Nachladen: Linearer Scan • Mehrere Versionen einer Klasse: Welche gewinnt? 29.09.2017 7 code.talks / Modularisierung (Rabea Gransberger @rgransberger)
  7. Java 9 Platform Module System (JPMS) JSR 376: 25. Nov

    2014 • Reliable configuration: Ersetzen des ClassPath (-Hell) • Strong encapsulation: public != Public • Scalable Java SE Platform (JEP 200: Modular JDK) • Greater platform integrity: illegal-access für interne API • Improved performance: Keine linearen scans mehr 29.09.2017 8 code.talks / Modularisierung (Rabea Gransberger @rgransberger)
  8. 29.09.2017 code.talks / Modularisierung (Rabea Gransberger @rgransberger) 9 102: Process

    API Updates 110: HTTP 2 Client 143: Improve Contended Locking 158: Unified JVM Logging 165: Compiler Control 193: Variable Handles 197: Segmented Code Cache 199: Smart Java Compilation, Phase Two 200: The Modular JDK 201: Modular Source Code 211: Elide Deprecation Warnings on Import Statements 212: Resolve Lint and Doclint Warnings 213: Milling Project Coin 214: Remove GC Combinations Deprecated in JDK 8 215: Tiered Attribution for javac 216: Process Import Statements Correctly 217: Annotations Pipeline 2.0 219: Datagram Transport Layer Security (DTLS) 220: Modular Run-Time Images 221: Simplified Doclet API 222: jshell: The Java Shell (Read-Eval-Print Loop) 223: New Version-String Scheme 224: HTML5 Javadoc 225: Javadoc Search 226: UTF-8 Property Files 227: Unicode 7.0 228: Add More Diagnostic Commands 229: Create PKCS12 Keystores by Default 231: Remove Launch-Time JRE Version Selection 232: Improve Secure Application Performance 233: Generate Run-Time Compiler Tests Automatically 235: Test Class-File Attributes Generated by javac 236: Parser API for Nashorn 237: Linux/AArch64 Port 238: Multi-Release JAR Files 240: Remove the JVM TI hprof Agent 241: Remove the jhat Tool 243: Java-Level JVM Compiler Interface 244: TLS Application-Layer Protocol Negotiation Extension 245: Validate JVM Command-Line Flag Arguments 246: Leverage CPU Instructions for GHASH and RSA 247: Compile for Older Platform Versions 248: Make G1 the Default Garbage Collector 249: OCSP Stapling for TLS 250: Store Interned Strings in CDS Archives 251: Multi-Resolution Images 252: Use CLDR Locale Data by Default 253: Prepare JavaFX UI Controls & CSS APIs for Modularization 254: Compact Strings 255: Merge Selected Xerces 2.11.0 Updates into JAXP 256: BeanInfo Annotations 257: Update JavaFX/Media to Newer Version of GStreamer 258: HarfBuzz Font-Layout Engine 259: Stack-Walking API 260: Encapsulate Most Internal APIs 261: Module System 262: TIFF Image I/O 263: HiDPI Graphics on Windows and Linux 264: Platform Logging API and Service 265: Marlin Graphics Renderer 265: Marlin Graphics Renderer 266: More Concurrency Updates 267: Unicode 8.0 268: XML Catalogs 269: Convenience Factory Methods for Collections 270: Reserved Stack Areas for Critical Sections 271: Unified GC Logging 272: Platform-Specific Desktop Features 273: DRBG-Based SecureRandom Implementations 274: Enhanced Method Handles 275: Modular Java Application Packaging 276: Dynamic Linking of Language-Defined Object Models 277: Enhanced Deprecation 278: Additional Tests for Humongous Objects in G1 279: Improve Test-Failure Troubleshooting 280: Indify String Concatenation 281: HotSpot C++ Unit-Test Framework 282: jlink: The Java Linker 283: Enable GTK 3 on Linux 284: New HotSpot Build System 285: Spin-Wait Hints 287: SHA-3 Hash Algorithms 288: Disable SHA-1 Certificates 289: Deprecate the Applet API 290: Filter Incoming Serialization Data 292: Implement Selected ECMAScript 6 Features in Nashorn 294: Linux/s390x Port 295: Ahead-of-Time Compilation 297: Unified arm32/arm64 Port 298: Remove Demos and Samples
  9. Java 9 – Aus Entwicklersicht • Java8Project • src •

    de.rgra.car • Car.java • de.rgra.internal • InternalConfiguration.java 29.09.2017 10 code.talks / Modularisierung (Rabea Gransberger @rgransberger)
  10. Java 9 – Aus Entwicklersicht • Java9Project • src •

    module-info.java • de.rgra.car • Car.java • de.rgra.internal • InternalConfiguration.java 29.09.2017 11 code.talks / Modularisierung (Rabea Gransberger @rgransberger)
  11. Java 9 Moduldefinition src\module-info.java module <name> { requires <Module>; exports

    <package>; uses <Service>; provides <Service> with <Impl>; } 29.09.2017 12 code.talks / Modularisierung (Rabea Gransberger @rgransberger)
  12. Java 9 – Aus Entwicklersicht • de.rgra.model • src •

    module-info.java • de.rgra.car • Car.java • de.rgra.internal • InternalConfiguration.java 29.09.2017 13 code.talks / Modularisierung (Rabea Gransberger @rgransberger) module-info.java module de.rgra.model { requires java.base; requires de.rgra.base; exports de.rgra.car; }
  13. Java 9 – Aus Entwicklersicht • Sichtbarkeit und Zugriff für

    bestimmte Module erlauben module de.rgra.model { requires java.base; requires transitive de.rgra.base; exports de.rgra.car; exports de.rgra.internal to de.rgra.model.test; opens de.rgra.internal to de.rgra.model.test; } • Services: uses … /provides … with … 29.09.2017 14 code.talks / Modularisierung (Rabea Gransberger @rgransberger)
  14. Java 9 – Aus Entwicklersicht • module-info gehört zur API

    • Module Path statt Class Path (-p statt –cp) • Gleiche Klassen, Packages führen zu Fehlern • Schnellere Ladezeiten, Weniger ClassNotFound • Interne APIs führen zu Warnungen auf Konsole • jdeps -jdkinternals • Modular Runtime Images: jlink 29.09.2017 15 code.talks / Modularisierung (Rabea Gransberger @rgransberger)
  15. Java 9 – Was fehlt? • Versionsnummern: An Modulen und

    Packages • Mehrere Versionen eines Moduls • Theoretisch möglich über Layer • Start/Stop/Replace von Modulen zur Laufzeit 29.09.2017 16 code.talks / Modularisierung (Rabea Gransberger @rgransberger)
  16. Java 10 - Planung • Mehr Code zieht zum OpenJDK

    um • Mission Control und FlightRecorder Open Source • Release März 2018 als 18.3 (Vorschlag 06.09.2017) • Folgende Feature Releases alle halbe Jahr: März / September • Update Releases: Jan, Apr, Jul, Okt • LTS Releases alle 3 Jahre ab September 2018 • https://mreinhold.org/blog/forward-faster • https://blogs.oracle.com/java-platform-group/faster-and-easier-use-and-redistribution-of-java-se 29.09.2017 17 code.talks / Modularisierung (Rabea Gransberger @rgransberger)
  17. Warum Module? 29.09.2017 code.talks / Modularisierung (Rabea Gransberger @rgransberger) 18

  18. 29.09.2017 19 code.talks / Modularisierung (Rabea Gransberger @rgransberger)

  19. 29.09.2017 20 code.talks / Modularisierung (Rabea Gransberger @rgransberger) Carola Lilienthal:

    It's all about the domain, honey!
  20. 29.09.2017 21 code.talks / Modularisierung (Rabea Gransberger @rgransberger)

  21. 29.09.2017 22 code.talks / Modularisierung (Rabea Gransberger @rgransberger) https://c2.staticflickr.com/4/3206 /2348940045_40482b7109_b.jpg

  22. Module mit klaren Grenzen customer.service invoice.service picture.service camera.service 29.09.2017 23

    code.talks / Modularisierung (Rabea Gransberger @rgransberger)
  23. OTIS • 155.159 LOC • 42.528 Klassen • 3884 Packages

    • 285 Plugins (aka Modules) 29.09.2017 24 code.talks / Modularisierung (Rabea Gransberger @rgransberger)
  24. Beim Tierarzt 29.09.2017 25 code.talks / Modularisierung (Rabea Gransberger @rgransberger)

  25. Entities 29.09.2017 27 code.talks / Modularisierung (Rabea Gransberger @rgransberger) Customer

    Pet Visit Invoice
  26. 29.09.2017 28 code.talks / Modularisierung (Rabea Gransberger @rgransberger)

  27. Mein Kumpel … 29.09.2017 29 code.talks / Modularisierung (Rabea Gransberger

    @rgransberger)
  28. 29.09.2017 30 code.talks / Modularisierung (Rabea Gransberger @rgransberger) Aufträge Autos

    Marke Reparatur
  29. Tierklinik Entities 29.09.2017 31 code.talks / Modularisierung (Rabea Gransberger @rgransberger)

    Customer Pet Visit Invoice
  30. Werkstatt Entities 29.09.2017 32 code.talks / Modularisierung (Rabea Gransberger @rgransberger)

    Customer Pet Visit Invoice Car
  31. Wie finde ich Module? • Bereiche ohne zyklische Abhängigkeiten •

    Tipp: Design Pattern verwenden • Tools • Structure 101 • Sonargraph • UML • jQAssistant • Degraph 29.09.2017 33 code.talks / Modularisierung (Rabea Gransberger @rgransberger) customer.service invoice.service
  32. 1. Analyse 29.09.2017 34 code.talks / Modularisierung (Rabea Gransberger @rgransberger)

  33. 29.09.2017 35 code.talks / Modularisierung (Rabea Gransberger @rgransberger)

  34. 29.09.2017 36 code.talks / Modularisierung (Rabea Gransberger @rgransberger)

  35. 29.09.2017 37 code.talks / Modularisierung (Rabea Gransberger @rgransberger)

  36. Fachliche Schichten 29.09.2017 38 code.talks / Modularisierung (Rabea Gransberger @rgransberger)

    Customer Pet Visit Invoice
  37. Technische Schichten 29.09.2017 39 code.talks / Modularisierung (Rabea Gransberger @rgransberger)

    Customer Pet Visit Invoice DB Model UI
  38. 1. Refactoring: Technische Schichten 29.09.2017 40 code.talks / Modularisierung (Rabea

    Gransberger @rgransberger) customer customer. model customer. db customer. ui
  39. Technische Schichten 29.09.2017 41 code.talks / Modularisierung (Rabea Gransberger @rgransberger)

    Customer Pet Visit Invoice DB Model UI
  40. 2. Analyse 29.09.2017 42 code.talks / Modularisierung (Rabea Gransberger @rgransberger)

  41. Java 9 29.09.2017 code.talks / Modularisierung (Rabea Gransberger @rgransberger) 43

  42. Backwards Compatible? • Fast… wenn keine interne API verwendet wurden

    • Warnungen auf der Konsole beachten (-illegal-access Schalter) • Prüfen mit jdeps -jdkinternal • Beispiel Applikation läuft mit Java 9 ohne Modifikation • Classpath wird weiter genutzt als unnamed module 29.09.2017 44 code.talks / Modularisierung (Rabea Gransberger @rgransberger)
  43. Java 9 Moduldefinition src\module-info.java module <name> { requires <Module>; exports

    <package>; uses <Service>; provides <Service> with <Impl>; } 29.09.2017 45 code.talks / Modularisierung (Rabea Gransberger @rgransberger)
  44. 29.09.2017 46 code.talks / Modularisierung (Rabea Gransberger @rgransberger) model ui

    db util requires module model { exports db; } module ui { requires model; exports table; } table CustomerTable Customer getCustomer() Module
  45. 29.09.2017 47 code.talks / Modularisierung (Rabea Gransberger @rgransberger) model ui

    db util table requires module model { exports db; } module ui { requires model; exports table; } Module
  46. 29.09.2017 code.talks / Modularisierung (Rabea Gransberger @rgransberger) 48 Customer Pet

    Visit Invoice Car
  47. Neue Module 29.09.2017 49 code.talks / Modularisierung (Rabea Gransberger @rgransberger)

    model customer.model visit.model invoice.model ui customer.ui visit.ui invoice.ui pet pet.model pet.db pet.ui vet ui
  48. 2. Refactoring: Module erstellen 29.09.2017 50 code.talks / Modularisierung (Rabea

    Gransberger @rgransberger) • Vorsicht: Keine Split-Packages model customer ui customer
  49. 29.09.2017 51 code.talks / Modularisierung (Rabea Gransberger @rgransberger)

  50. CustomerView private Node createTabPane() { TabPane tabPane = new TabPane();

    tabPane.getTabs().add(createTab("Tiere", createPetNode())); tabPane.getTabs().add(createTab("Rechnungen", createInvoiceNode())); return tabPane; } private Node createPetNode() { List<Pet> pets = new PetDao().fetchPetsForCustomer(customer.getId()); PetTable table = new PetTable(pets, false) { protected void onDoubleClick(Pet pet) { replace(new PetView(customer, pet)); } }; return table; } 29.09.2017 52 code.talks / Modularisierung (Rabea Gransberger @rgransberger)
  51. 3. Refactoring: Abhängigkeiten auflösen 29.09.2017 53 code.talks / Modularisierung (Rabea

    Gransberger @rgransberger) ui CustomerView TabService List<Tab> createTabs() pet PetTabService List<Tab> createTabs() PetTable module ui { exports service; uses CustomerViewTabService; } module pet { requires ui; provides CustomerViewTabService with PetCustomerViewTabService; } Service Loader
  52. 4. Refactoring: Die Werkstatt • de.rgra.car ersetzt de.rgra.pet • de.rgra.vet.ui

    wird zu de.rgra.app • Neuer Service: ApplicationConfigurationProvider • Neu: de.rgra.vet.app und de.rgra.car.app • implementieren ApplicationConfigurationProvider 29.09.2017 54 code.talks / Modularisierung (Rabea Gransberger @rgransberger)
  53. 29.09.2017 code.talks / Modularisierung (Rabea Gransberger @rgransberger) 55

  54. Jigsaw Dependency Visualizer 29.09.2017 56 code.talks / Modularisierung (Rabea Gransberger

    @rgransberger)
  55. Deployment 29.09.2017 code.talks / Modularisierung (Rabea Gransberger @rgransberger) 57

  56. Compile • %JAVA_9%\javac --module-path mods --module-source-path "./*/src" -d classes @sources.txt

    • %JAVA_9%\jar --create --file mlib/vet/de.rgra.model.jar -C mods/vet/de.rgra.model_05 . 29.09.2017 58 code.talks / Modularisierung (Rabea Gransberger @rgransberger)
  57. Run • %JAVA_9%\java -p mods/vet -m de.rgra.vet.app_05/de.rgra.vet.VetAppConfiguration 29.09.2017 60 code.talks

    / Modularisierung (Rabea Gransberger @rgransberger)
  58. JLink • Java + eigene Module in einem Paket •

    %JAVA_9%/jlink --module-path %JAVA_9%\jmods;mlib;mlib/vet --add-modules de.rgra.vet.app_05 --output vetapp --launcher vet=de.rgra.vet.app_05/de.rgra.vet.VetAppConfiguration • run vetapp/bin/vet.bat 29.09.2017 61 code.talks / Modularisierung (Rabea Gransberger @rgransberger)
  59. Zusammenfassung 29.09.2017 code.talks / Modularisierung (Rabea Gransberger @rgransberger) 62

  60. 29.09.2017 code.talks / Modularisierung (Rabea Gransberger @rgransberger) 63

  61. code.talks / Modularisierung (Rabea Gransberger @rgransberger) 29.09.2017 64

  62. Refactoring Schritte Package Struktur: <domain>.<product>.<deployable> .<businesslayer> .<technicallayer>.<subpackage> 1. Abhängigkeiten analysieren

    2. Module identifizieren / erstellen 3. Code verschieben 4. Abhängigkeiten durch Services auflösen 5. Gehe zu 1. 29.09.2017 65 code.talks / Modularisierung (Rabea Gransberger @rgransberger)
  63. 29.09.2017 66 code.talks / Modularisierung (Rabea Gransberger @rgransberger) https://i.ytimg.com/vi/RijScDMVQzQ/maxresdefault.jpg "The

    only thing a big bang rewrite guarantees is a Big Bang!" (M. Fowler)
  64. Vorteile Module vs. Monolith • Architektur spiegelt sich in Modulen

    wieder • Klare Grenzen / Sicherheit: Public Klassen können versteckt sein • Einzelne Module können leicht ausgetauscht werden • Module Path robuster als Classpath • Runtime Fehler (NoClassDefFoundError) werden beim Start entdeckt, nicht beim Klassen nachladen. Bessere Fehlermeldungen: Modul fehlt, Export fehlt • Jar Hell: 2 Versionen eines Jars im Classpath • Bessere Tool Unterstützung: Welche Dependencies fehlen? • Kleinere Deployments • Bessere (Startup-) Performance 29.09.2017 68 code.talks / Modularisierung (Rabea Gransberger @rgransberger)
  65. Es gibt noch mehr … • Unnamed Modules • Named

    Modules (Explicit Module, Open Module, Automatic Module) • Parameter javac / java: z.B. --add-reads / --add-modules • Neue Tools: jlink / jdeps 29.09.2017 69 code.talks / Modularisierung (Rabea Gransberger @rgransberger)
  66. Slides & Code: https://rgra.github.io Twitter: @rgransberger Sprecht mich an Codewort:

    Hallo Rabea ;) P.S.: Deutscher Java / JVM Slack Channel: jvm-german 29.09.2017 70 code.talks / Modularisierung (Rabea Gransberger @rgransberger)