Upload
christian-schlichtherle
View
106
Download
0
Embed Size (px)
Citation preview
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
MotivationTrennung API und Implementierungen
Wiederverwendbarkeit von Komponenten
Vereinfachung der Konfiguration
Unterschiedliche Entwicklungszyklen von Komponenten
Anpassung an verschiedene Laufzeitumgebungen
Minimierung von Abhängigkeiten
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
Unterschiedliche Entwicklungszyklen von Komponenten
IdeeZerlegung großer Anwendungen in Komponenten mit unabhängigen Entwicklungszyklen
VorteileVerkürzung von Entwicklungszyklen
Verteilung kleinerer Programmeinheiten
Beispiele
Unterschiedliche Entwicklungszyklen von Komponenten
Idee
Vorteile
Beispiele Apache Maven maven-compiler-plugin 3.3
maven-resources-plugin 2.7
maven-jar-plugin 2.6
maven-surefire-plugin 2.18
maven-core 3.3.1
Trennung API und Implementierungen
Idee Schnittstellen und Implementierungen werden in getrennten Modulen untergebracht
VorteileEin API, viele Implementierungen
Getrennte Entwicklungszyklen möglich
Beispiele
Trennung API und Implementierungen
Idee
Vorteile
BeispieleTrueUpdate
API TrueUpate Installer Core
ImplementierungenTrueUpdate Installer JSR88
TrueUpdate Installer OpenEJB
TrueUpdate Installer Tomcat
TrueUpdate Installer Cargo
TrueCommons
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
Minimierung von Abhängigkeiten
Beispiele
Idee Module sollten minimale Abhängigkeiten haben
VorteileVermeidung von Konflikten
Minimierung der Programmgröße
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
Minimierung von Abhängigkeiten
Beispiele TrueLicenseTrueLicense JSON
AbhängigkeitenJackson JSON Processor
TrueLicense Core
Implementiert das V2/JSON-Lizenzschlüsselformat
TrueLicense Core
Idee
Vorteile
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
Vereinfachung der Konfiguration
Idee
Vorteile
Beispiele TrueVFS TrueVFS Driver TAR.GZIP
TrueVFS Driver ZIP
TrueVFS Driver FILE
Anpassung an verschiedene Laufzeitumgebungen
Beispiele
IdeeEine 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
Anpassung an verschiedene Laufzeitumgebungen
Beispiele TrueUpdate
Basisfunktionalität TrueUpdate Manager Core
IntegrationsadapterTrueUpdate Manager Servlet
TrueUpdate Manager EJB
Idee
Vorteile
Modularity Maturity Model
Module
Modularität
Loose Kopplung
Devolution
Dynamisierung
Zusammenfassung
Ad-Hoc
Ad-HocKennzeichen
Keine formale Beachtung von Modularität
Sammlung von Klassendateien ohne Struktur
Flacher Klassenpfad
Verwendung von Bibliotheken in JAR-Dateien
Monolithische Anwendung
Uber-JAR
Nutzen
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
Module
Kennzeichen
NutzenEntkoppelt Module von Artefakten EAR/JAR/WAR
Klarere Sicht auf den Modulzusammenbau
Schafft ein Bewusstsein für Versionen
Ermöglicht Modulkataloge
Beispiele
Module
Kennzeichen
Nutzen
Beispiele
RPM
OSGi
Apache Maven
<project> <dependencies> <dependency> <groupId>net.java.trueupdate</groupId> <artifactId>trueupdate-‐installer-‐core</artifactId> <version>0.8.1-‐SNAPSHOT</version> </dependency> <dependency> <groupId>org.apache.openejb</groupId> <artifactId>arquillian-‐openejb-‐embedded-‐4</artifactId> <version>4.7.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.apache.openejb</groupId> <artifactId>openejb-‐core</artifactId> <version>4.7.1</version> <scope>provided</scope> </dependency> </dependencies> [...]</project>
Apache Ivy
Module
Kennzeichen
Nutzen
Beispiele
RPM
OSGi
Apache Maven
Apache Ivy
<dependencies> <dependency org="net.java.trueupdate" name="trueupdate-‐installer-‐core" rev="0.8.1"/> <dependency org="org.apache.openejb" name="arquillian-‐openejb-‐embedded-‐4" rev="4.7.1" conf="test"/> <dependency org="org.apache.openejb" name="openejb-‐core" rev="4.7.1" conf="provided"/></dependencies>
Modularität
Kennzeichen
Deklarierung von Verträgen für ModuleFähigkeiten
Anforderungen
Implementierungsdetails sind privat
Zunächst Auflösung von Abhängigkeiten, dann Modulidentität
Nutzen
Gegenbeispiele
Modularität
Kennzeichen
Nutzen
Feingranulares Erfassen der Auswirkungen
vonFehlerkorrekturen
Kompatibilitätsbrüchen
aufImplementierungen
Anwendungen
Bewusstsein für Systemstruktur
Kunden/Anbieter-Unabhängigkeit
Anforderungsbasierte Überprüfung von Abhängigkeiten
Gegenbeispiele
Modularität
Kennzeichen
Nutzen
Gegenbeispiele
"Junkyard Module"
"Messy Module"
Loose KopplungKennzeichen
Trennung der Schnittstellen von ihren Implementierungen indirekte Nutzung von Implementierungen
Keine Factories
Kein `new`
Servicebasierte Zusammenarbeit von Modulen
Semantische Versionierung von Abhängigkeiten
Nutzen
DevolutionKennzeichen
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
AufsichtAbnahmen
Lebenszyklen
Nutzen
Devolution
Kennzeichen
Nutzen
Größeres Bewusstsein für vorhandene Module
Geringere Duplikation von Code erhöht Qualität
Bessere Zusammenarbeit auf Basis von Modulen
Qualitätskontrolle im laufenden Betrieb
DynamisierungKennzeichen
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
Dynamisierung
Kennzeichen
Nutzen
Dynamische Aktualisierung von laufenden Systemen zur ...
Erweiterung von Fähigkeiten
Korrektur von Fehlern
Auflösung von Beschränkungen durch Verwendung verschiedener Versionen desselben Moduls
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
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
Bis Level 5: DevolutionArzneimittel
Apache Ant / Ivy
Gradle
SBT
Apache Maven
AnwendungsgebieteKleine Projekte
Große Unternehmensanwendungen
Statische Modularisierung
Gegenanzeigen IOC-ContainerServlet
EJB
Bis Level 6: Dynamisierung
Dynamische Modularisierung
AnwendungsgebieteIOC-Container
Servlet
EJB
Große Unternehmensanwendungen
Arzneimittel
OSGiEclipse Equinox
Apache Felix
Gegenanzeigen Kleine Projekte
Techniken zur Modularisierung
Auflösung von Konflikten
Anwendung von Modularisierungsmustern
Erstellung eines Plugins
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
TrueCommons Annotations
Erleichtern den Umgang mit java.util.ServiceLoader
Generieren Resource-Dateien in META-INF/services
BeispieleImplementierung fremder Schnittstellen
Implementierung eigener Schnittstellen
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;
@ServiceImplementationpublic class UltimateServiceImplementationimplements UltimateServiceSpecification { ...}
package com.company.project.spec;
import net.java.truecommons.services.annotations.ServiceSpecification;
@ServiceSpecificationpublic interface UltimateServiceSpecification { ...}
TrueCommons Services Konzept
Erleichtert die Implementierung von Plugins
Beispiele
Beispiele TrueVFS Kernel Specification
FsDriverMapFactory.java
FsDriverMapModifier.java
FsDriverMapLocator.java
TrueVFS Driver TAR.GZIP TarGZipDriverMapModifier.java
TrueVFS Driver ZIP ZipDriverMapModifier.java
Der wahlfreie Zugriff auf Archivdateien soll nur durch Konfiguration des Klassenpfades ermöglicht werden
Implementierung des Service-Locator-Entwurfsmusters
TrueVFS Kernel Specification
FsDriverMapFactory.java
package net.java.truevfs.kernel.spec.spi;
import net.java.truecommons.annotations.ServiceImplementation;import net.java.truecommons.annotations.ServiceSpecification;import net.java.truecommons.services.LocatableFactory;import net.java.truevfs.kernel.spec.FsDriver;import net.java.truevfs.kernel.spec.FsScheme;
import java.util.LinkedHashMap;import java.util.Map;
@ServiceSpecification@ServiceImplementationpublic class FsDriverMapFactoryextends LocatableFactory<Map<FsScheme, FsDriver>> {
@Override public Map<FsScheme, FsDriver> get() { return new LinkedHashMap<>(32); }}
FsDriverMapModifier.java
FsDriverMapLocator.java
TrueVFS Kernel Specification
FsDriverMapFactory.java
FsDriverMapModifier.java
package net.java.truevfs.kernel.spec.spi;
import net.java.truecommons.annotations.ServiceSpecification;import net.java.truecommons.services.LocatableModifier;import net.java.truevfs.kernel.spec.FsDriver;import net.java.truevfs.kernel.spec.FsScheme;
import java.util.Map;
@ServiceSpecificationpublic abstract class FsDriverMapModifierextends LocatableModifier<Map<FsScheme, FsDriver>> { }
FsDriverMapLocator.java
TrueVFS Kernel Specification
FsDriverMapFactory.java
FsDriverMapModifier.java
FsDriverMapLocator.java
package net.java.truevfs.kernel.spec.sl;
import net.java.truecommons.services.Container;import net.java.truecommons.services.ServiceLocator;import net.java.truevfs.kernel.spec.FsDriver;import net.java.truevfs.kernel.spec.FsScheme;import net.java.truevfs.kernel.spec.spi.FsDriverMapFactory;import net.java.truevfs.kernel.spec.spi.FsDriverMapModifier;
import java.util.Collections;import java.util.Map;
public final class FsDriverMapLocatorimplements Container<Map<FsScheme, FsDriver>> {
public static final FsDriverMapLocator SINGLETON = new FsDriverMapLocator();
private final Map<FsScheme, FsDriver> drivers = Collections.unmodifiableMap( new ServiceLocator(FsDriverMapLocator.class) .factory(FsDriverMapFactory.class, FsDriverMapModifier.class) .get());
private FsDriverMapLocator() { }
@Override public Map<FsScheme, FsDriver> get() { return drivers; }}
TrueVFS Driver TAR.GZIP TarGZipDriverMapModifier.java
package net.java.truevfs.driver.tar.gzip;
import net.java.truecommons.annotations.ServiceImplementation;import net.java.truecommons.shed.ExtensionSet;import net.java.truevfs.kernel.spec.FsDriver;import net.java.truevfs.kernel.spec.FsScheme;import net.java.truevfs.kernel.spec.spi.FsDriverMapModifier;
import java.util.Map;
@ServiceImplementationpublic final class TarGZipDriverMapModifier extends FsDriverMapModifier {
@Override public Map<FsScheme, FsDriver> apply(final Map<FsScheme, FsDriver> map) { final FsDriver driver = new TarGZipDriver(); for (final String extension : new ExtensionSet("tar.gz|tar.gzip|tgz")) map.put(FsScheme.create(extension), driver); return map; }}
TrueVFS Driver ZIP ZipDriverMapModifier.java
package net.java.truevfs.driver.zip;
import net.java.truecommons.annotations.ServiceImplementation;import net.java.truevfs.comp.zipdriver.ZipDriver;import net.java.truevfs.kernel.spec.FsDriver;import net.java.truevfs.kernel.spec.FsScheme;import net.java.truevfs.kernel.spec.spi.FsDriverMapModifier;
import java.util.Map;
@ServiceImplementationpublic final class ZipDriverMapModifier extends FsDriverMapModifier {
@Override public Map<FsScheme, FsDriver> apply(final Map<FsScheme, FsDriver> map) { map.put(FsScheme.create("zip"), new ZipDriver()); return map; }}
Azyklische AbhängigkeitenAnalysetools
Module dürfen keine zyklischen Abhängigkeiten haben Das gleiche gilt eigentlich auch für Pakete
Ausgangssituation
Lösungsverfahren
Azyklische AbhängigkeitenAnalysetools
JDepend
JDepend Maven Plugin
Apache Maven
Beispiel
TrueLicense Maven Plugin
TrueLicense Maven Plugin
Module dürfen keine zyklischen Abhängigkeiten haben
Ausgangssituation
Lösungsverfahren
Azyklische Abhängigkeiten
Analysetools
Module dürfen keine zyklischen Abhängigkeiten haben
Ausgangssituation
Zyklische Abhängigkeit zwischen Klassen und Modulen (Quelle: [JAA])
Lösungsverfahren
Azyklische Abhängigkeiten
Analysetools
Module dürfen keine zyklischen Abhängigkeiten haben
Ausgangssituation
Lösungsverfahren
Eskalation
Auflösung durch Eskalation (Quelle: [JAA])
De-Eskalation
Rückrufschnittstelle
Azyklische Abhängigkeiten
Analysetools
Module dürfen keine zyklischen Abhängigkeiten haben
Ausgangssituation
Lösungsverfahren
Eskalation
De-Eskalation
Auflösung durch De-Eskalation (Quelle: [JAA])
Rückrufschnittstelle
Azyklische Abhängigkeiten
Analysetools
Module dürfen keine zyklischen Abhängigkeiten haben
Ausgangssituation
Lösungsverfahren
Eskalation
De-Eskalation
Rückrufschnittstelle
Auflösung durch Rückrufschnittstelle (Quelle: [JAA])
Auflösung von Konflikten
Ausgangssituation Ein Abhängigkeitsgraph kann Versionskonflikte enthalten
LösungsverfahrenStatische Modularisierung
Dynamische Modularisierung
LösungsverfahrenStatische Modularisierung
<project> <dependencyManagement> <dependencies> <dependency> <groupId>commons-‐collections</groupId> <artifactId>commons-‐collections</artifactId> <version>3.2.1</version> </dependency> […] </dependencies> </dependencyManagement> […]</project>
Dynamische Modularisierung
Exkurs: SOLID Entwurfsprinzipien
Single responsibility principle
Open/closed principle
Liskov substitution principle
Interface segregation principle
Dependency inversion principle
Quellen / Literatur[JAA]
[SMB]
[CC]
[LC]
/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-pluginhttps://maven.apache.org/plugins/maven-resources-plugin/
/Modularisierung - was soll das.../Motivation/Unterschiedliche Entwicklungsz.../Beispiele/Apache Maven/maven-compiler-pluginhttps://maven.apache.org/plugins/maven-compiler-plugin/
/Modularisierung - was soll das.../Motivation/Unterschiedliche Entwicklungsz.../Beispiele/Apache Maven/maven-surefire-pluginhttp://maven.apache.org/surefire/maven-surefire-plugin/
/Modularisierung - was soll das.../Motivation/Unterschiedliche Entwicklungsz.../Beispiele/Apache Maven/maven-jar-pluginhttps://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.
/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
/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/
/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 initiativehttp://www.osgi.org/Main/HomePage
/Modularisierung - was soll das.../Strategien zur Modularisierung/Bis Level 6: Dynamisierung/Arzneimittel/OSGi/Eclipse Equinoxhttps://eclipse.org/equinox/
/Modularisierung - was soll das.../Strategien zur Modularisierung/Bis Level 6: Dynamisierung/Arzneimittel/OSGi/Apache Felixhttp://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 Annotationshttps://truecommons.java.net/apidocs/net/java/truecommons/annotations/package-summary.html
/Modularisierung - was soll das.../Techniken zur Modularisierung/Erstellung eines Plugins/Tools/TrueCommons Serviceshttps://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/JDependhttp://clarkware.com/software/JDepend.html
/Modularisierung - was soll das.../Techniken zur Modularisierung/Anwendung von Modularisierungs.../Abhängigkeitsmuster/Azyklische Abhängigkeiten/Analysetools/JDepend Maven Pluginhttp://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 Pluginhttps://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 Pluginhttps://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
/Modularisierung - was soll das.../Exkurs: SOLID Entwurfsprinzipi.../Dependency inversion principlehttp://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