3. Abhängigkeitsmanagement
Maven verfügt über ein umfangreiches Abhängigkeitsmanagement. Dabei werden
Projektabhängigkeiten(dependencies) im POM des Projekts angegeben und bei Bedarf
direkt von Maven aufgelöst. Alle Abhängigkeiten sind in Repositories organisiert und
müssen somit nicht physisch im Projekt existieren, sondern können zur Erstellungszeit aus
dem jeweiligen Repository geladen werden. Ein großer Vorteil von Maven ist, dass es auch
transitive Abhängigkeiten auflösen kann. Dabei ist daran zu erinnern, dass alle Bibliotheken,
Plugins und Projekte als Artefakte in diesen Maven-Reposiories gespeichert werden können.
Alle Objekte im Repository verfügen über ein POM und sind somit eindeutig
identifizierbar.
3.1. Hierarchie und Vererbung
Durch dieses Abhängigkeitsmanagement können POMs hierarchisch gegliedert werden.
Dabei werden die Einstellungen vom eingebundenen POM an das Parent POM
vererbt:
- dependencies: Abhängigkeiten, die vom eingebundenen POM benötigt werden,
werden transitive Abhängigkeiten genannt.
- developer: Entwickler, die an der Erstellung des eingebundenen POMs beteiligt
waren
- plugins: Plugins, die vom eingebundenen POM benötigt werden
- reports: Reports und Seiten, die für das eingebundene POM generiert werden
Allen POMs liegt das sogenannte ”Super POM” zugrunde, das in der Installation von
Maven enthalten ist. Dieses POM beinhaltet alle Standard-Konventionen. Dazu gehört zum
Beispiel die Verzeichnisstruktur der Projekte sowie die Beschreibung der Standard-Plugins,
die von jedem POM verwendet werden. Das Super POM liegt in der Datei pom-4.0.0.xml
im JAVA-Archiv ${M2_HOME}/lib/maven-2.0.9-uber.jar.
3.2. Maven-Repositories
In einem Maven Repository können Artefakte eindeutig identifizierbar abgelegt werden. Es
gibt unterschiedliche Arten von Repositories:
- Zentrales Repository (http://repo1.maven.org/maven2)
Das zentrale Maven-Repository enthält eine Vielzahl von Maven-Plugins, auch
von Drittanbietern. Benötigt Maven für ein Projekt ein bestimmtes Plugin,
Bibliothek oder andere Abhängigkeit, die noch nicht im lokalen Repository
vorhanden ist, so versucht Maven diese Artefakte vom zentralen Repository zu
beziehen und im lokalen Repository abzulegen.
- Lokales Repository (unter .m2/repository)
Das lokale Repository liegt im Mavenverzeichnis im Benutzerhomeverzeichnis.
Alle, jemals von Maven verwendete Artefakte sind in diesem Repository
organisiert. Es empfiehlt sich, die Größe dieses Repositories im Auge zu
behalten, da es schnell an Größe gewinnt und eventuell unbemerkt an die
Kapazitätsgrenzen des Speichermediums stösst.
- Externes Repository (z.B:Apache Archiva)
Ein externes Repository ähnelt dem zentralen Repository. In ihm können
bestimmte Bibliotheken oder andere Artefakte zur Verfügung gestellt werden.
Apache Archiva ist das Apache-Projekt mit dem ein externes Repository erstellt
werden kann. Auch Nexus ist eine gute Alternative. Externe Repositories sind
vor allem für grössere Projekte empfehlenswert, da benötigte Abhängigkeiten
nahe an den Entwicklern liegen und nicht für jeden Entwickler einzeln von einem
zentralen Repository über das Internet bezogen werden müssen.
Die folgende Abbildung zeigt den Aufbau eines lokalen Repositories.
3.3. Einbindung von Abhängigkeiten
Um Abhängigkeiten in einem Projekt zu deklarieren, muss die Datei POM.xml des Projekts
erweitert werden.
1<dependencies> 2 <dependency> 3 <groupId>junit</groupId> 4 <artifactId>junit</artifactId> 5 <version>3.8.1</version> 6 <scope>test</scope> 7 </dependency> 8</dependencies>
Abhängigkeiten verfügen über verschiedene Gültigkeitssbereiche(Scopes) im Projekt, die
angeben während welcher Phasen diese Abhängigkeiten benötigt werden.
- compile : Abhängigkeit wird immer benötigt (default) und ist im resultierenden
Package enthalten
- provided : Wird später vom jeweiligen Laufzeitcontainer bereitgestellt und wird
nicht mit in das Package eingebunden
- test : Wird nur zum testen des Projekts benötigt
- runtime : Wird nur zur Laufzeit und/oder zum Testen des Projekts benötigt und
nicht zum compilieren
- system : Auf die betreffenden Bibliotheken muss durch eine Pfadangabe im
Filesystem verwiesen werden. Diese Abhänigkeit wird nicht mit in das Package
eingebunden