Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Restrukturierung der Code-Basis mit Java 9

Restrukturierung der Code-Basis mit Java 9

JavaLand 2017, Köln/Brühl

Jeder Entwickler ertappt sich dabei, wie er sich wünscht, mit einem neuen Projekt zu beginnen, um diesmal alles besser zu machen und dem Chaos im aktuellen Code zu entfliehen. Mit Version 9 unterstützt Java die Aufteilung von Code in einzelne Module. Zugriffsregeln zwischen den Modulen können z.B. die Nutzung von UI-Klassen aus Model-Klassen heraus verbieten. Durch diesen Ansatz lässt sich die bestehende Code-Basis in einzelne Teile zerlegen, um mehr Übersicht zu schaffen. Diese kleineren Module sind als eigene Projekte deutlich einfacher zu warten und sorgen für ein besseres Gefühl bei Entwicklern.

Dieser Vortrag zeigt Strategien zur Modularisierung von großen Projekten und berichtet von den gemachten Erfahrungen.

Rabea Gransberger

March 28, 2017
Tweet

More Decks by Rabea Gransberger

Other Decks in Programming

Transcript

  1. 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)
  2. OTIS • 155.159 LOC • 42.528 Klassen • 3884 Packages

    • 285 Plugins (aka Modules) 28.03.2017 7 JavaLand / Modularisierung (Rabea Gransberger @rgransberger)
  3. 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
  4. 1. Refactoring: Technische Schicht 28.03.2017 21 JavaLand / Modularisierung (Rabea

    Gransberger @rgransberger) customer customer. model customer. db customer. ui
  5. 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 ;)
  6. 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
  7. 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
  8. Java 9 Moduledefinition src\module-info.java module <name> { requires <Module>; exports

    <package>; uses <Service>; provides <Service> with <Impl>; } 28.03.2017 28 JavaLand / Modularisierung (Rabea Gransberger @rgransberger)
  9. 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()
  10. 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; }
  11. 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
  12. 2. Refactoring: Module erstellen 28.03.2017 33 JavaLand / Modularisierung (Rabea

    Gransberger @rgransberger) • Vorsicht: Keine Split-Packages model customer ui customer
  13. 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; } 28.03.2017 35 JavaLand / Modularisierung (Rabea Gransberger @rgransberger)
  14. 3. Refactoring: Abhängigkeiten auflösen 28.03.2017 36 JavaLand / 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
  15. 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)
  16. 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)
  17. 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)
  18. 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)
  19. Refactoring Schritte Package Struktur herstellen *: <domainprefix>.<produkt>.<deployable> .<fachlichesmodul>.<schicht>.<subpackage> 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
  20. 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)
  21. 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)
  22. Es gibt noch mehr … • Unnamed Modules • Named

    Modules (Explicit Module, Open Module, Automatic Module) • module-info.java • Versionierung: module <name>@<version> • Transitive Dependencies: requires transitive • Export für bestimmte Module: exports <package> to <module> • Runtime Zugriff / Reflection erlauben: opens <package> • Parameter javac / java: z.B. --add-reads / --permit-illegal-access • Neues Tools: jlink / jdeps 28.03.2017 55 JavaLand / Modularisierung (Rabea Gransberger @rgransberger)
  23. 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)
  24. 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)