Slide 1

Slide 1 text

Restrukturierung der Code- Basis mit Java 9 Rabea Gransberger (MEKO-S GmbH) @rgransberger

Slide 2

Slide 2 text

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 28.03.2017 2 JavaLand / Modularisierung (Rabea Gransberger @rgransberger)

Slide 3

Slide 3 text

28.03.2017 3 JavaLand / Modularisierung (Rabea Gransberger @rgransberger)

Slide 4

Slide 4 text

28.03.2017 4 JavaLand / Modularisierung (Rabea Gransberger @rgransberger) Carola Lilienthal: It's all about the domain, honey!

Slide 5

Slide 5 text

28.03.2017 5 JavaLand / Modularisierung (Rabea Gransberger @rgransberger) https://c2.staticflickr.com/4/3206 /2348940045_40482b7109_b.jpg

Slide 6

Slide 6 text

Module mit klaren Grenzen customer.service invoice.service picture.service camera.service 28.03.2017 6 JavaLand / Modularisierung (Rabea Gransberger @rgransberger)

Slide 7

Slide 7 text

OTIS • 155.159 LOC • 42.528 Klassen • 3884 Packages • 285 Plugins (aka Modules) 28.03.2017 7 JavaLand / Modularisierung (Rabea Gransberger @rgransberger)

Slide 8

Slide 8 text

Beim Tierarzt 28.03.2017 8 JavaLand / Modularisierung (Rabea Gransberger @rgransberger)

Slide 9

Slide 9 text

28.03.2017 9 JavaLand / Modularisierung (Rabea Gransberger @rgransberger)

Slide 10

Slide 10 text

Mein Kumpel … 28.03.2017 10 JavaLand / Modularisierung (Rabea Gransberger @rgransberger)

Slide 11

Slide 11 text

28.03.2017 11 JavaLand / Modularisierung (Rabea Gransberger @rgransberger) Aufträge Autos Marke Reparatur

Slide 12

Slide 12 text

Tierklinik Entities 28.03.2017 12 JavaLand / Modularisierung (Rabea Gransberger @rgransberger) Customer Pet Visit Invoice

Slide 13

Slide 13 text

Werkstatt Entities 28.03.2017 13 JavaLand / Modularisierung (Rabea Gransberger @rgransberger) Customer Pet Visit Invoice Car

Slide 14

Slide 14 text

Wie finde ich Module? • Bereiche ohne zyklische Abhängigkeiten • Tools • Structure 101 • Sonargraph • UML • jQAssistant • Degraph 28.03.2017 14 JavaLand / Modularisierung (Rabea Gransberger @rgransberger) customer.service invoice.service

Slide 15

Slide 15 text

1. Analyse 28.03.2017 15 JavaLand / Modularisierung (Rabea Gransberger @rgransberger)

Slide 16

Slide 16 text

28.03.2017 16 JavaLand / Modularisierung (Rabea Gransberger @rgransberger)

Slide 17

Slide 17 text

28.03.2017 17 JavaLand / Modularisierung (Rabea Gransberger @rgransberger)

Slide 18

Slide 18 text

28.03.2017 18 JavaLand / Modularisierung (Rabea Gransberger @rgransberger)

Slide 19

Slide 19 text

Fachliche Schichten 28.03.2017 19 JavaLand / Modularisierung (Rabea Gransberger @rgransberger) Customer Pet Visit Invoice

Slide 20

Slide 20 text

Technische Schichten 28.03.2017 20 JavaLand / Modularisierung (Rabea Gransberger @rgransberger) Customer Pet Visit Invoice DB Model UI

Slide 21

Slide 21 text

1. Refactoring: Technische Schicht 28.03.2017 21 JavaLand / Modularisierung (Rabea Gransberger @rgransberger) customer customer. model customer. db customer. ui

Slide 22

Slide 22 text

Technische Schichten 28.03.2017 22 JavaLand / Modularisierung (Rabea Gransberger @rgransberger) Customer Pet Visit Invoice DB Model UI

Slide 23

Slide 23 text

2. Analyse 28.03.2017 23 JavaLand / Modularisierung (Rabea Gransberger @rgransberger)

Slide 24

Slide 24 text

Java 9 28.03.2017 JavaLand / Modularisierung (Rabea Gransberger @rgransberger) 24

Slide 25

Slide 25 text

Java 9: Early Access • Java 9 Early Acccess Build 161 • Release Datum: 27.7.2017 • Eclipse • Download Oxygen (nicht über den Installer!) • Patch Java 9 Support (BETA) for Oxygen • IntelliJ • IntelliJ IDEA 2017.1 • NetBeans • Nightly Builds 28.03.2017 25 JavaLand / Modularisierung (Rabea Gransberger @rgransberger) Testet vor euren Kunden ;)

Slide 26

Slide 26 text

28.03.2017 JavaLand / Modularisierung (Rabea Gransberger @rgransberger) 26 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

Slide 27

Slide 27 text

Project Jigsaw • JSR 376: Java Platform Module System • Alt: Classpath (-cp) • Fehler nach x Minuten beim Klassen nachladen • Neu: Module-Path (-p) • Fehler beim Start 28.03.2017 27 JavaLand / Modularisierung (Rabea Gransberger @rgransberger) Copyright Oracle

Slide 28

Slide 28 text

Java 9 Moduledefinition src\module-info.java module { requires ; exports ; uses ; provides with ; } 28.03.2017 28 JavaLand / Modularisierung (Rabea Gransberger @rgransberger)

Slide 29

Slide 29 text

Module 28.03.2017 29 JavaLand / Modularisierung (Rabea Gransberger @rgransberger) model ui db util requires module model { exports db; } module ui { requires model; exports table; } table CustomerTable Customer getCustomer()

Slide 30

Slide 30 text

Module 28.03.2017 30 JavaLand / Modularisierung (Rabea Gransberger @rgransberger) model ui db util table requires module model { exports db; } module ui { requires model; exports table; }

Slide 31

Slide 31 text

28.03.2017 31 JavaLand / Modularisierung (Rabea Gransberger @rgransberger) Customer Pet Visit Invoice Car

Slide 32

Slide 32 text

Neue Module 28.03.2017 32 JavaLand / 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

Slide 33

Slide 33 text

2. Refactoring: Module erstellen 28.03.2017 33 JavaLand / Modularisierung (Rabea Gransberger @rgransberger) • Vorsicht: Keine Split-Packages model customer ui customer

Slide 34

Slide 34 text

28.03.2017 34 JavaLand / Modularisierung (Rabea Gransberger @rgransberger)

Slide 35

Slide 35 text

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 pets = new PetDao().fetchPetsForCustomer(customer.getId()); PetTable table = new PetTable(pets, false) { protected void onDoubleClick(Pet pet) { replace(new PetView(customer, pet)); } }; return table; } 28.03.2017 35 JavaLand / Modularisierung (Rabea Gransberger @rgransberger)

Slide 36

Slide 36 text

3. Refactoring: Abhängigkeiten auflösen 28.03.2017 36 JavaLand / Modularisierung (Rabea Gransberger @rgransberger) ui CustomerView TabService List createTabs() pet PetTabService List createTabs() PetTable module ui { exports service; uses CustomerViewTabService; } module pet { requires ui; provides CustomerViewTabService with PetCustomerViewTabService; } Service Loader

Slide 37

Slide 37 text

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 28.03.2017 37 JavaLand / Modularisierung (Rabea Gransberger @rgransberger)

Slide 38

Slide 38 text

28.03.2017 38 JavaLand / Modularisierung (Rabea Gransberger @rgransberger)

Slide 39

Slide 39 text

28.03.2017 39 JavaLand / Modularisierung (Rabea Gransberger @rgransberger)

Slide 40

Slide 40 text

28.03.2017 40 JavaLand / Modularisierung (Rabea Gransberger @rgransberger)

Slide 41

Slide 41 text

Jigsaw Dependency Visualizer 28.03.2017 41 JavaLand / Modularisierung (Rabea Gransberger @rgransberger)

Slide 42

Slide 42 text

Deployment 28.03.2017 JavaLand / Modularisierung (Rabea Gransberger @rgransberger) 42

Slide 43

Slide 43 text

Compile • %JAVA_9%\javac --module-path mods/vet -d mods/vet/de.rgra.model_05 @sources.txt • %JAVA_9%\jar --create --file mlib/vet/de.rgra.model.jar -C mods/vet/de.rgra.model_05 . 28.03.2017 43 JavaLand / Modularisierung (Rabea Gransberger @rgransberger)

Slide 44

Slide 44 text

Compile • dir /s /B *.java > ..\sources.txt • cd .. • %JAVA_9%\javac --module-path mods/vet -d mods/vet/de.rgra.model_05 @sources.txt • xcopy /s/Y "de.rgra.model_05/resources" "mods/vet/de.rgra.model_05" • %JAVA_9%\jar --create --file mlib/vet/de.rgra.model.jar -C mods/vet/de.rgra.model_05 . 28.03.2017 44 JavaLand / Modularisierung (Rabea Gransberger @rgransberger)

Slide 45

Slide 45 text

Run • %JAVA_9%\java -p mods/vet -m de.rgra.vet.app_05/de.rgra.vet.VetAppConfiguration 28.03.2017 45 JavaLand / Modularisierung (Rabea Gransberger @rgransberger)

Slide 46

Slide 46 text

JLink • Java + eigene Module in einem Paket • %JAVA_9%/jlink --module-path %JAVA_9%\jmods;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 28.03.2017 46 JavaLand / Modularisierung (Rabea Gransberger @rgransberger)

Slide 47

Slide 47 text

Zusammenfassung 28.03.2017 JavaLand / Modularisierung (Rabea Gransberger @rgransberger) 47

Slide 48

Slide 48 text

28.03.2017 48 JavaLand / Modularisierung (Rabea Gransberger @rgransberger) Carola Lilienthal: It's all about the domain, honey!

Slide 49

Slide 49 text

JavaLand / Modularisierung (Rabea Gransberger @rgransberger) 28.03.2017 49

Slide 50

Slide 50 text

Refactoring Schritte Package Struktur herstellen *: .. ... 1. Abhängigkeiten analysieren 2. Module identifizieren / erstellen 3. Code verschieben 4. Abhängigkeiten durch Services auflösen 5. Gehe zu 1. Tipp: %JAVA_9%/bin/jdeps: Erstellt module-info aus jar 28.03.2017 50 JavaLand / Modularisierung (Rabea Gransberger @rgransberger) * https://jaxenter.de/degraph-45584

Slide 51

Slide 51 text

28.03.2017 51 JavaLand / Modularisierung (Rabea Gransberger @rgransberger)

Slide 52

Slide 52 text

28.03.2017 52 JavaLand / Modularisierung (Rabea Gransberger @rgransberger) https://i.ytimg.com/vi/RijScDMVQzQ/maxresdefault.jpg

Slide 53

Slide 53 text

Tipp • Nicht: Monolith komplett in Module zerlegen • Viel Arbeit • Schwer zu testen • Wenig Nutzen • Besser: Module identifizieren wenn erforderlich wie im Beispiel Pet durch Car ersetzen • "The only thing a big bang rewrite guarantees is a Big Bang!" (M. Fowler) 28.03.2017 53 JavaLand / Modularisierung (Rabea Gransberger @rgransberger)

Slide 54

Slide 54 text

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 28.03.2017 54 JavaLand / Modularisierung (Rabea Gransberger @rgransberger)

Slide 55

Slide 55 text

Es gibt noch mehr … • Unnamed Modules • Named Modules (Explicit Module, Open Module, Automatic Module) • module-info.java • Versionierung: module @ • Transitive Dependencies: requires transitive • Export für bestimmte Module: exports to • Runtime Zugriff / Reflection erlauben: opens • Parameter javac / java: z.B. --add-reads / --permit-illegal-access • Neues Tools: jlink / jdeps 28.03.2017 55 JavaLand / Modularisierung (Rabea Gransberger @rgransberger)

Slide 56

Slide 56 text

Passende Java 9 / Architektur Vorträge • Di, 11:00, HTTP/2 in Java 9 (Weinschenker), Schauspielhaus • Di, 16:00, Java 9 Modularity in Action (Mak, Bakker), Silverado • Mi, 09:00, Migrating to Java 9 Modules (Mak, Bakker), Schauspielhaus • Mi, 10:00, It's all about the domain, honey (Lilienthal), Schauspielhaus • Mi, 11:00, Pragmatic Developers Guide Java 9 (Shelajev, Maple), Eventhalle • Mi, 12:00, JShell (Müller), Quantum 3/4 • Mi, 12:00, Kontinu. Architektur-Dokumentation (Sippach), Schauspielhaus • Mi, 13:00, Monolithen zähmen leicht gemacht (Schulz), Schauspielhaus 28.03.2017 56 JavaLand / Modularisierung (Rabea Gransberger @rgransberger)

Slide 57

Slide 57 text

Slides & Code: https://rgra.github.io Twitter: @rgransberger Feedback Willkommen! P.S.: Deutscher Java / JVM Slack Channel: jvm-german 28.03.2017 57 JavaLand / Modularisierung (Rabea Gransberger @rgransberger)