Eine Einführung in das Thema Modularisierung von Software für die Java Virtual Machine (JVM). Behandelt werden die Motivation, ein Modell für den Reifegrad, Strategien zur Modularisierung, ausgewählte Techniken zur Modularisierung, das große Bild und ein Exkurs zum Thema SOLID Entwurfsprinzipien. Abgeschlossen wird das ganze mit Literaturhinweisen.
2. Modularisierung - was soll das?
http://christian.schlichtherle.de
Motivation
Quellen / Literatur
Modularity Maturity Model
Strategien zur Modularisierung
Exkurs: SOLID Entwurfsprinzipien
Techniken zur Modularisierung
Das große Bild
3. Motivation
Trennung API und Implementierungen
Wiederverwendbarkeit von Komponenten
Vereinfachung der Konfiguration
Unterschiedliche Entwicklungszyklen von
Komponenten
Anpassung an verschiedene
Laufzeitumgebungen
Minimierung von Abhängigkeiten
4. Wiederverwendbarkeit von Komponenten
Idee
Ein Modul ist eine natürliche Einheit für
wiederverwendbare Softwarekomponenten
Module können von anderen Modulen
abhängig sein
Module bündeln Pakete mit Klassen zu
funktionalen Einheiten
Vorteile
Module haben einen größeren Betrachtungs-
gegenstand als Pakete oder gar Klassen
Höheres Abstraktionsniveau erreichbar
Leichtere Verteilung durch Bündelung in EAR/
JAR/WAR-Dateien
7. Trennung API und Implementierungen
Idee
Schnittstellen und Implementierungen werden
in getrennten Modulen untergebracht
Vorteile
Ein API, viele Implementierungen
Getrennte Entwicklungszyklen möglich
Beispiele
8. Trennung API und Implementierungen
Idee
Vorteile
Beispiele
TrueUpdate
API TrueUpate Installer Core
Implementierungen
TrueUpdate Installer JSR88
TrueUpdate Installer OpenEJB
TrueUpdate Installer Tomcat
TrueUpdate Installer Cargo
TrueCommons
9. Trennung API und Implementierungen
Idee
Vorteile
Beispiele
TrueUpdate
TrueCommons
API TrueCommons KeyManager Specification
Implementierungen
TrueCommons KeyManager Console
TrueCommons KeyManager Swing
TrueCommons KeyManager Mac OS X
11. Minimierung von Abhängigkeiten
Beispiele TrueLicense
TrueLicense JSON
TrueLicense Core
Implementiert u.a. das V2/XML-
Lizenzschlüsselformat
Abhängigkeiten (keine bzw. nur JRE)
Idee
Vorteile
12. Minimierung von Abhängigkeiten
Beispiele TrueLicense
TrueLicense JSON
Abhängigkeiten
Jackson JSON Processor
TrueLicense Core
Implementiert das V2/JSON-
Lizenzschlüsselformat
TrueLicense Core
Idee
Vorteile
13. Vereinfachung der Konfiguration
Idee Jedes Modul implementiert genau ein Feature
Module werden als Plugins realisiert
Plugins können zur Laufzeit gefunden und
geladen werden
Features müssen eine definierte Schnittstelle
implementieren
Vorteile
Die Konfiguration des Klassenpfades definiert
die Menge an verfügbaren Features
Keine weitere Konfiguration notwendig
Beispiele
15. Anpassung an verschiedene
Laufzeitumgebungen
Beispiele
Idee
Eine Komponente und ihre Integration in
verschiedene Laufzeitumgebungen sollten in
getrennten Modulen implementiert werden
Vorteile
Die Komponente ist nicht mehr von einer
konkreten Laufzeitumgebung abhängig
Pro Laufzeitumgebung ein separates Modul Minimierung von Abhängigkeiten
18. Ad-Hoc
Kennzeichen
Keine formale Beachtung von Modularität
Sammlung von Klassendateien ohne Struktur
Flacher Klassenpfad
Verwendung von Bibliotheken in JAR-Dateien
Monolithische Anwendung
Uber-JAR
Nutzen
20. Module
Kennzeichen
Formalisierung der Identität von Modulen Metadaten in Artefakten oder Katalogen
Module haben eine Versionsnummer
Modellierung von Abhängigkeiten basierend
auf diesen Identitäten
Bau
Entwicklung
Betrieb
Nutzen
Beispiele
24. Modularität
Kennzeichen
Deklarierung von Verträgen für Module
Fähigkeiten
Anforderungen
Implementierungsdetails sind privat
Zunächst Auflösung von Abhängigkeiten,
dann Modulidentität
Nutzen
Gegenbeispiele
25. Modularität
Kennzeichen
Nutzen
Feingranulares Erfassen der Auswirkungen
von
Fehlerkorrekturen
Kompatibilitätsbrüchen
auf
Implementierungen
Anwendungen
Bewusstsein für Systemstruktur
Kunden/Anbieter-Unabhängigkeit
Anforderungsbasierte Überprüfung von
Abhängigkeiten
Gegenbeispiele
27. Loose Kopplung
Kennzeichen
Trennung der Schnittstellen von ihren
Implementierungen
indirekte Nutzung von Implementierungen
Keine Factories
Kein `new`
Servicebasierte Zusammenarbeit von
Modulen
Semantische Versionierung von
Abhängigkeiten
Nutzen
29. Devolution
Kennzeichen
Delegation des Eigentums von Artefakten an
Repositories mit Unterstützung für Modularität
Repositories können spezielle Unterstützung
anbieten
Zusammenarbeit
Kommentierung
Bewertungen
Foren
Aufsicht
Abnahmen
Lebenszyklen
Nutzen
31. Dynamisierung
Kennzeichen
Dynamischer Lebenszyklus von Modulen
Module sind sich des Lebenszyklus bewusst Z.B. gibt es keine globalen Variablen
Unterstützung von Moduloperationen zur
Laufzeit
Hinzufügen
Entfernen
Ersetzen
Nutzen
33. Zusammenfassung
Formale Identität, abgekoppelt von Artefakten
Keine Modularisierung
Formale Verträge für Module, entkoppelt von
deren Identität
Dienste mit semantischer Versionierung,
entkoppelt von ihrer Implementierung
Betrieb von Repositories mit Unterstützung
für Modularität, Zusammenarbeit und
Aufsicht, unabhängig vom Eigentum
Unterstützung von Lebenszyklen ohne
Beeinträchtigung des laufenden Betriebs
34. Strategien zur Modularisierung
Bis Level 5: Devolution
Bis Level 6: Dynamisierung
Grundsätzlich iterative Vorgehensweise Keinen Level ignorieren
Keinen Level überspringen
Stufenweise Erhöhung des Levels
35. Bis Level 5: Devolution
Arzneimittel
Apache Ant / Ivy
Gradle
SBT
Apache Maven
Anwendungsgebiete
Kleine Projekte
Große Unternehmensanwendungen
Statische Modularisierung
Gegenanzeigen IOC-Container
Servlet
EJB
36. Bis Level 6: Dynamisierung
Dynamische Modularisierung
Anwendungsgebiete
IOC-Container
Servlet
EJB
Große Unternehmensanwendungen
Arzneimittel
OSGi
Eclipse Equinox
Apache Felix
Gegenanzeigen Kleine Projekte
38. Erstellung eines Plugins Tools
TrueCommons Services Konzept
Erleichtert die Implementierung von Plugins
Beispiele
TrueCommons Annotations
Erleichtern den Umgang mit
java.util.ServiceLoader
Beispiele
Apache Maven
Das grundsätzliche Werkzeug für die
Modularisierung
39. TrueCommons Annotations
Erleichtern den Umgang mit
java.util.ServiceLoader
Generieren Resource-Dateien in META-INF/
services
Beispiele
Implementierung fremder Schnittstellen
Implementierung eigener Schnittstellen
40. TrueCommons Annotations
Erleichtern den Umgang mit
java.util.ServiceLoader
Beispiele
Implementierung fremder Schnittstellen
package
com.company.project;
import
java.nio.charset.spi.CharsetProvider;
import
net.java.truecommons.services.annotations.ServiceImplementation;
@ServiceImplementation(CharsetProvider.class)
public
class
Ibm437CharsetProvider
extends
CharsetProvider
{
...
}
Implementierung eigener Schnittstellen package
com.company.project.impl;
import
com.company.project.spec.UltimateServiceSpecification;
import
net.java.truecommons.services.annotations.ServiceImplementation;
@ServiceImplementation
public
class
UltimateServiceImplementation
implements
UltimateServiceSpecification
{
...
}
package
com.company.project.spec;
import
net.java.truecommons.services.annotations.ServiceSpecification;
@ServiceSpecification
public
interface
UltimateServiceSpecification
{
...
}
62. /Modularisierung - was soll das.../Modularity Maturity Model
Vorgestellt von Graham Charters (IBM) auf dem OSGi Community Event 2011.
http://de.slideshare.net/mfrancis/ibm-sponsorship-keynote-towards-a-modularity-maturity-model-graham-
charters
/Modularisierung - was soll das.../Exkurs: SOLID Entwurfsprinzipi...
Ausführlich erklärt in Anhang A von Kirk Knoernschilds Buch.
http://en.wikipedia.org/wiki/SOLID_(object-oriented_design)
/Modularisierung - was soll das.../Motivation/Unterschiedliche Entwicklungsz.../Beispiele/Apache
Maven
„Apache Maven is a software project management and comprehension tool.“
https://maven.apache.org
/Modularisierung - was soll das.../Motivation/Unterschiedliche Entwicklungsz.../Beispiele/Apache
Maven/maven-resources-plugin
https://maven.apache.org/plugins/maven-resources-plugin/
/Modularisierung - was soll das.../Motivation/Unterschiedliche Entwicklungsz.../Beispiele/Apache
Maven/maven-compiler-plugin
https://maven.apache.org/plugins/maven-compiler-plugin/
/Modularisierung - was soll das.../Motivation/Unterschiedliche Entwicklungsz.../Beispiele/Apache
Maven/maven-surefire-plugin
http://maven.apache.org/surefire/maven-surefire-plugin/
/Modularisierung - was soll das.../Motivation/Unterschiedliche Entwicklungsz.../Beispiele/Apache
Maven/maven-jar-plugin
https://maven.apache.org/plugins/maven-jar-plugin/
/Modularisierung - was soll das.../Motivation/Trennung API und Implementieru.../Beispiele/
TrueUpdate
Ein Framework zur (halb-)automatischen Aktualisierung von installierten Enterprise-
Java-Anwendungen.
https://trueupdate.java.net
/Modularisierung - was soll das.../Motivation/Trennung API und Implementieru.../Beispiele/
TrueCommons
Eine Sammlung wiederverwendbarer Softwarekomponenten, analog zu den Apache
Commons.
https://truecommons.java.net
/Modularisierung - was soll das.../Motivation/Minimierung von Abhängigkeiten/Beispiele/
TrueLicense/TrueLicense JSON/Abhängigkeiten/Jackson JSON Processor
Benötigt ca. 1,5 MB Speicherplatz für die JAR-Dateien.
63. /Modularisierung - was soll das.../Motivation/Vereinfachung der Konfiguratio.../Beispiele/TrueVFS
TrueVFS ist ein virtuelles Dateisystem für Archivdateien (ZIP, TAR, etc).
https://truevfs.java.net
/Modularisierung - was soll das.../Motivation/Vereinfachung der Konfiguratio.../Beispiele/TrueVFS/
TrueVFS Driver FILE
Ermöglicht den wahlfreien Zugriff auf das Plattformdateisystem.
https://truevfs.java.net/truevfs-driver/truevfs-driver-file/index.html
/Modularisierung - was soll das.../Motivation/Vereinfachung der Konfiguratio.../Beispiele/TrueVFS/
TrueVFS Driver TAR.GZIP
Ermöglicht den wahlfreien Zugriff auf TAR.GZIP-Dateien.
https://truevfs.java.net/truevfs-driver/truevfs-driver-tar-gzip/index.html
/Modularisierung - was soll das.../Motivation/Vereinfachung der Konfiguratio.../Beispiele/TrueVFS/
TrueVFS Driver ZIP
Ermöglicht den wahlfreien Zugriff auf ZIP-Dateien.
https://truevfs.java.net/truevfs-driver/truevfs-driver-zip/index.html
/Modularisierung - was soll das.../Motivation/Anpassung an verschiedene Lauf.../Beispiele/
TrueUpdate
Ein Framework zur (halb-)automatischen Aktualisierung von installierten Enterprise-
Java-Anwendungen.
https://trueupdate.java.net
/Modularisierung - was soll das.../Motivation/Anpassung an verschiedene Lauf.../Beispiele/
TrueUpdate/Basisfunktionalität/TrueUpdate Manager Core
Kommuniziert mit einer Zielanwendung in demselben Container und einem
Repository auf einem separaten Server und führt ggf. Updates der Zielanwendung
durch.
/Modularisierung - was soll das.../Motivation/Anpassung an verschiedene Lauf.../Beispiele/
TrueUpdate/Integrationsadapter/TrueUpdate Manager EJB
Integriert den TrueUpdate Manager in einen EJB-Container.
/Modularisierung - was soll das.../Motivation/Anpassung an verschiedene Lauf.../Beispiele/
TrueUpdate/Integrationsadapter/TrueUpdate Manager Servlet
Integriert den TrueUpdate Manager in einen Servlet-Container.
/Modularisierung - was soll das.../Modularity Maturity Model/Module/Beispiele/Apache Maven
„Apache Maven is a software project management and comprehension tool.“
https://maven.apache.org
64. /Modularisierung - was soll das.../Modularity Maturity Model/Module/Beispiele/Apache Ivy
"Apache Ivy™ is a popular dependency manager focusing on flexibility and
simplicity.“
http://ant.apache.org/ivy/
/Modularisierung - was soll das.../Modularity Maturity Model/Module/Beispiele/RPM
"The RPM Package Manager (RPM) is a powerful command line driven package
management system capable of installing, uninstalling, verifying, querying, and
updating computer software packages."
http://www.rpm.org
/Modularisierung - was soll das.../Modularity Maturity Model/Module/Beispiele/OSGi
"OSGi™ - The Dynamic Module System for Java™."
http://www.osgi.org/Main/HomePage
/Modularisierung - was soll das.../Modularity Maturity Model/Modularität/Gegenbeispiele/"Junkyard
Module"
http://www.ruhrnachrichten.de/storage/pic/mdhl/artikelbilder/lokales/rn/bolo/bochum/3871428_1_0514bo-
Schrottplatz_dam5.jpg?version=1387194298
/Modularisierung - was soll das.../Modularity Maturity Model/Modularität/Gegenbeispiele/"Messy
Module"
http://de.wikipedia.org/wiki/Messie-Syndrom
/Modularisierung - was soll das.../Modularity Maturity Model/Loose Kopplung/Kennzeichen/
Semantische Versionierung von ...
http://semver.org
/Modularisierung - was soll das.../Modularity Maturity Model/Dynamisierung/Kennzeichen/
Dynamischer Lebenszyklus von M...
OSGi: BundleActivator-Schnittstelle: https://osgi.org/javadoc/r4v43/core/org/osgi/
framework/BundleActivator.html .
/Modularisierung - was soll das.../Strategien zur Modularisierung/Bis Level 5: Devolution/
Arzneimittel/Apache Maven
„Apache Maven is a software project management and comprehension tool.“
https://maven.apache.org
/Modularisierung - was soll das.../Strategien zur Modularisierung/Bis Level 5: Devolution/
Arzneimittel/Apache Ant / Ivy
"Apache Ivy™ is a popular dependency manager focusing on flexibility and
simplicity.“
http://ant.apache.org/ivy/
65. /Modularisierung - was soll das.../Strategien zur Modularisierung/Bis Level 5: Devolution/
Arzneimittel/Gradle
From command line to IDE to continuous integration, only one Enterprise build
automation system to rule them all.
https://gradle.org
/Modularisierung - was soll das.../Strategien zur Modularisierung/Bis Level 5: Devolution/
Arzneimittel/SBT
sbt is a build tool for Scala, Java, and more.
http://www.scala-sbt.org/index.html
/Modularisierung - was soll das.../Strategien zur Modularisierung/Bis Level 5: Devolution/
Anwendungsgebiete
Gemäß Arzneimittelgesetz Paragraph 11: Packungsbeilage.
/Modularisierung - was soll das.../Strategien zur Modularisierung/Bis Level 5: Devolution/
Gegenanzeigen
Gemäß Arzneimittelgesetz Paragraph 11: Packungsbeilage.
/Modularisierung - was soll das.../Strategien zur Modularisierung/Bis Level 6: Dynamisierung/
Arzneimittel/OSGi
Open Services Gateway initiative
http://www.osgi.org/Main/HomePage
/Modularisierung - was soll das.../Strategien zur Modularisierung/Bis Level 6: Dynamisierung/
Arzneimittel/OSGi/Eclipse Equinox
https://eclipse.org/equinox/
/Modularisierung - was soll das.../Strategien zur Modularisierung/Bis Level 6: Dynamisierung/
Arzneimittel/OSGi/Apache Felix
http://felix.apache.org
/Modularisierung - was soll das.../Strategien zur Modularisierung/Bis Level 6: Dynamisierung/
Anwendungsgebiete
Gemäß Arzneimittelgesetz Paragraph 11: Packungsbeilage.
/Modularisierung - was soll das.../Techniken zur Modularisierung/Erstellung eines Plugins/Tools/
Apache Maven
„Apache Maven is a software project management and comprehension tool.“
https://maven.apache.org
/Modularisierung - was soll das.../Techniken zur Modularisierung/Erstellung eines Plugins/Tools/
TrueCommons Annotations
https://truecommons.java.net/apidocs/net/java/truecommons/annotations/package-summary.html
66. /Modularisierung - was soll das.../Techniken zur Modularisierung/Erstellung eines Plugins/Tools/
TrueCommons Services
https://truecommons.java.net/apidocs/net/java/truecommons/services/package-summary.html
/Modularisierung - was soll das.../Techniken zur Modularisierung/Anwendung von
Modularisierungs.../Abhängigkeitsmuster/Azyklische Abhängigkeiten/Analysetools/Apache Maven
„Apache Maven is a software project management and comprehension tool.“
https://maven.apache.org
/Modularisierung - was soll das.../Techniken zur Modularisierung/Anwendung von
Modularisierungs.../Abhängigkeitsmuster/Azyklische Abhängigkeiten/Analysetools/JDepend
http://clarkware.com/software/JDepend.html
/Modularisierung - was soll das.../Techniken zur Modularisierung/Anwendung von
Modularisierungs.../Abhängigkeitsmuster/Azyklische Abhängigkeiten/Analysetools/JDepend Maven
Plugin
http://mojo.codehaus.org/jdepend-maven-plugin/
/Modularisierung - was soll das.../Techniken zur Modularisierung/Anwendung von
Modularisierungs.../Abhängigkeitsmuster/Azyklische Abhängigkeiten/Analysetools/Beispiel/
TrueLicense Maven Plugin
https://truelicense.java.net/truelicense-maven-plugin/dependencies.html
/Modularisierung - was soll das.../Techniken zur Modularisierung/Anwendung von
Modularisierungs.../Abhängigkeitsmuster/Azyklische Abhängigkeiten/Analysetools/Beispiel/
TrueLicense Maven Plugin
https://truelicense.java.net/truelicense-maven-plugin/jdepend-report.html
/Modularisierung - was soll das.../Das große Bild/Quelle: [JAA]
Quelle: [JAA]: Figure 6.4: Granularity and architecture all the way down
/Modularisierung - was soll das.../Exkurs: SOLID Entwurfsprinzipi.../Single responsibility principl...
http://en.wikipedia.org/wiki/Single_responsibility_principle
/Modularisierung - was soll das.../Exkurs: SOLID Entwurfsprinzipi.../Open/closed principle
http://en.wikipedia.org/wiki/Open/closed_principle
/Modularisierung - was soll das.../Exkurs: SOLID Entwurfsprinzipi.../Liskov substitution principle
http://en.wikipedia.org/wiki/Liskov_substitution_principle
/Modularisierung - was soll das.../Exkurs: SOLID Entwurfsprinzipi.../Interface segregation principl...
http://en.wikipedia.org/wiki/Interface_segregation_principle
67. /Modularisierung - was soll das.../Exkurs: SOLID Entwurfsprinzipi.../Dependency inversion
principle
http://en.wikipedia.org/wiki/Dependency_inversion_principle
/Modularisierung - was soll das.../Quellen / Literatur/[SMB]
Ulf Fildebrandt: Software modular bauen: Architektur von langlebigen
Softwaresystemen - Grundlagen und Anwendung mit OSGi und Java
(dpunkt.verlag)
http://www.amazon.de/Software-modular-bauen-Architektur-Softwaresystemen-ebook/dp/B00AIBE0YI
/Modularisierung - was soll das.../Quellen / Literatur/[JAA]
Kirk Knoernschild: Java Application Architecture: Modularity Patterns with
Examples Using OSGI (Prentice Hall)
http://www.amazon.de/Java-Application-Architecture-Modularity-Patterns-ebook/dp/B007KOGS5U
/Modularisierung - was soll das.../Quellen / Literatur/[LC]
http://www.amazon.de/Working-Effectively-Legacy-Robert-Martin-ebook/dp/B005OYHF0A
/Modularisierung - was soll das.../Quellen / Literatur/[CC]
Robert C. Martin: Clean Code: A Handbook of Agile Software Craftsmanship
(Prentice Hall)
http://ecx.images-amazon.com/images/I/51d1qVhmAmL.jpg