Einführung in Maven

Maven ist wie ANT ein Werkzeug um den build-Prozess eines Projektes zu unterstützen. Da Maven, wie auch Ant, von der Apache Software Foundation entwickelt wird, handelt es sich hierbei um ein kostenloses build-Werkzeug. Die Architektur von Maven unterscheidet sich allerdings grundlegend von der Ant-Architektur. Ein Ant build-Skript ist aus einer Menge von Targets aufgebaut, die die einzelnen build-Ziele realisieren. Dafür können beliebig viele Targets genutzt und auch benannt werden. Mit der Entwicklung von Maven sollten Probleme, wie den nicht genau zu erkennen build-Ablauf bei einem Ant-Skript, wie auch die Wiederverwendung von bestimmten Zielen gelöst werden. Der Implementierungsaufwand soll sich somit für die Prozesse stark reduzieren.
Der grundlegende Unterschied zwischen Maven und Ant ist die Philosophie der Ansätze. Maven basiert auf einem modellbasierten, deklarativen Ansatz zur Realisierung des build-Prozesses. Anstatt wie bei Ant die einzelnen build-Ziele zu implementieren, werden in einem sogenannten Projektmodell (meistens pom.xml) nur die Metadaten des Projektes beschrieben. Zu den Metadaten gehören zum einen Angaben über die verwendete Projektstruktur, wie auch die Spezifizierung der externen Bibliotheken. Somit ist der grundlegende Unterschied der beiden Werkzeuge bekannt. Bei einem Ant gesteuerten Ablauf muss der Entwickler vieles selber entwickeln, wobei diesem dann auch jegliche Freiheit und Möglichkeiten angeboten werden. Maven hingegen setzt auf eine Menge von Annahmen die den Ablauf des build-Prozesses bestimmen. Dadurch ist die Gestaltungsfreiheit bei einem Maven build-Prozess zwar eingeschränkt, bietet dem Entwickler aber dafür eine hohe Wiederverwendung und einen kleineren Aufwand.

Maven im Umfeld von CSI

Bei Maven handelt es sich, wie im vorherigen Abschnitt beschrieben, um ein build-Werkzeug um automatisierte build-Vorgänge abzubilden. Zur Überprüfung der Automatisierbarkeit der Test-Werkzeuge wurde in diesem Kontext die Version 2.2.1 von Maven gewählt. Die Automatisierungsfunktion stellt in dem Rahmen von CSI einen großen Stellenwert dar. Es existiert eine Menge von unterschiedlichen Testwerkzeugen die in Hinsicht der Automatisierung mit Hilfe von Maven untersucht werden sollen. Dabei stellt sich die Frage, welche Unterstützung die untersuchten Testwerkzeuge unter der Betrachtung der Automatisierung bieten. Die ersten Auswertungen der Testwerkzeuge haben ergeben, das bekannte Test-Werkzeuge wie JUnit, TestNG oder auch jMock eine gute Unterstützung von Maven anbieten. Es stehen sogenannte Plugins zur Nutzung zur Verfügung. Die Unterstützung aller Test-Werkzeuge ist allerdings nicht gegeben, da manche Testwerkzeuge einen eigenen Stil zur Analyse der Tests definieren. Dies macht es schwierig, die gewonnenen Informationen der Tests mit Maven zu ermitteln und zu dokumentieren.

Installation

Die Installation von Maven ist kurz in der Readme des heruntergeladenen Archivs beschrieben. Dazu muss zuerst einmal die aktuelle Maven Version von der Homepage heruntergeladen werden. Danach folgt das Entpacken des heruntergeladenen Archivs an einer beliebige Stelle. Zum Schluss sollte noch der Pfad zum Maven bin-Verzeichnis in die PATH-Umgebungsvariable in den Suchpfad der Shell aufgenommen werden. Als Voraussetzung muss ein aktuelles JDK auf dem Rechner installiert sein. Zur Überprüfung der Installation kann per Konsole der Befehl mvn --version durchgeführt werden. Weiterhin ist zu beachten, dass das lokale Maven-Repository automatisch im Benutzer-Verzeichnis ${user.home}/.m2/repository abgelegt wird. Falls ein anderes Verzeichnis dazu genutzt werden soll, muss in der settings.xml (Verzeichnis conf im Installationsverzeichnis von Maven) das folgende Element geändert werden: <localRepository>/path/to/local/repo</localRepository>

Architektur

Die folgende Abbildung soll die Architektur von Maven darstellen. Dabei bildet das Projektmodell im Projektverzeichnis die zentrale Konfigurationsstelle für die Definition des build-Prozesses. Die bestehenden Abhängigkeiten werden über das lokale Repository aufgelöst. Falls die benötigten externen Bibliotheken nicht im lokalen Repository vorliegen, werden diese wenn möglich automatisch vom Remote-Repository heruntergeladen.
Maven_Architektur
Nach der Installation von Maven befindet sich nur der kompakte Kern auf dem Computer. Dieser ist lediglich in der Lage das Projektmodell zu interpretieren. Die einzelnen build-Prozesse werden durch eine Menge von Plugins realisiert. Dies führt bei der erstmaligen Nutzung von Maven am Anfang zu einen etwas längeren Herunterladen aller benötigten Standard-Plugins. Dieser Vorgang wird von Maven vollautomatisch durchgeführt.

Maven-Repository

Bei Maven stehen unterschiedliche Repositorys zur Verfügung. Zum einen dient das lokale Repository zur Auflösung der definierten externen Bibliotheken. In diesem Repository werden alle bestehenden Abhängigkeiten für ein Projektmodell heruntergeladen und es stellt somit die erste Anlaufstelle für den Maven build-Prozess dar. Wenn die bestehende Abhängigkeit für den build-Prozess nicht im lokalen Repository aufgelöst werden konnte, wird vollautomatisch das Remote-Repository angefragt und die benötigten Bibliotheken werden heruntergeladen. Weiterhin ist es möglich, dass eigene Bibliotheken in das lokale Repository eingetragen werden, dies gilt auch für die Veröffentlichung in das Remote Repository. Um schnell und einfach eine externe Bibliothek in das lokale Repository zu übernehmen kann der folgende Befehl ausgeführt werden:
mvn install:install-file -DgroupId=<groupid> -DartifactId=<artifactid> -Dversion=<version> -Dfile=<Bib-Archiv> -Dpackaging=<Packformat> -DgeneratePom=true

Dieser Befehl bewirkt die Eintragung der gewählten Bibliothek in das lokale Repository. Über das <dependency>-Element kann dann die externe Bibliothek an das Projektmodell gebunden werden. Bei dem <dependency>-Element handelt es sich um ein Maven spezifisches Element um Abhängigkeiten zu externen Bibliotheken zu definieren. Die Bedeutung der groupID und artifactID wird im folgenden Abschnitt erlätert.

Aufbau des Projektmodells

Maven basiert im Gegensatz zu Ant auf einen deklarativen Ansatz. In dem Projektmodell wird somit nicht der build-Prozess implementiert, sondern nur die Metadaten des Projektes werden beschrieben. Der allgemeine Aufbau eines Projektmodells soll die folgende Abbildung zeigen:
Projektmodell
Bei dem Projektmodell handelt es sich um ein XML-Dokument das standardmäßig pom.xml heißt. Um im Folgenden näher auf die Struktur und den Inhalt des Projektmodells eingehen zu können, soll eine pom.xml exemplarisch gezeigt werden. Im ersten Teil der pom.xml werden allgemeine Angaben zu dem Projekt gemacht. Einige Angaben sollten zur besseren Verständlichkeit immer gemacht werden. Diese Elemente werden im Folgenden kurz beschrieben: Im Folgenden der pom.xml können mit Hilfe des <properties>-Element projektspezifische Pfade angegeben werden. Wenn keine Properties explizit angegeben werden, trifft Maven bestimmte Annahmen. Dies ist ein wichtiger Punkt und sollte als Neueinsteiger beachtet werden. Als Neueinsteiger sollte zuerst mit den Standard-Pfaden von Maven gearbeitet werden, soweit dies möglich ist. Als kleine Referenz der Standard-Pfade wird auf die Standard-Auflistung von Maven verwiesen.
Das <Build>-Element der pom.xml definiert die Projektstruktur. Zum Einen muss definiert werden in welchen Verzeichnissen sich die Sourcen befinden. Zum Anderen müssen auch alle Ziele angegeben werden, in denen die kompilierten Sourcen und Dateien gespeichert werden sollen. Zu beachten ist hier, das bei den Angaben der Verzeichnisse zwischen normalen Verzeichnissen wie <sourceDirectory> und Test-Verzeichnissen wie <testOutputDirectory> unterschieden werden muss. Da Maven ein deklarativer Ansatz ist und deshalb mit vielen Annahmen arbeitet, müssen sich die Test-Sourcen dementsprechend auch in dem richtigen Verzeichnis befinden oder die Änderungen müssen Maven explizit bekannt gegeben werden.
Im letzten Abschnitt der pom.xml werden die bestehenden Abhängigkeiten (dependency) zu externen Bibliotheken definiert. In diesem Beispiel wird eine Abhängigkeit zu der JUnit-Bibliothek definiert. Diese muss dazu im lokalen Repository vorliegen, oder wird automatisch aus dem Remote-Repository in das lokale übertragen. Zur Definition muss die groupId, artifactId und die Version angegeben werden. Beim letzten Element <scope> wird der Bereich definiert, in dem die Abhängigkeit benötigt wird. In diesem Fall wurde der Bereich auf test gesetzt. Diese Einstellung bedeutet, dass bei der Ausführung der Testfälle die JUnit-Bibliothek benötigt wird.

Der Maven-Build-Lebenszyklus

Ein Maven-Build-Lebenszyklus wird durch eine ganze Menge von Standard-Build-Phasen beschrieben. Über einen Parameter kann ausgewählt werden bis zu welcher Phase der build-Prozess abgearbeitet werden soll. Da die einzelnen Phasen sukzessiv aufeinander aufbauen, werden alle vorherigen Phasen auch durchlaufen. Zur Vervollständigung der Thematik soll auf die Maven-Homepage verwiesen werden, die den gesamten Build-Lebenszyklus auflistet und kurz erläutert. Jede einzelne build-Phase in dem Lebenszyklus wird mit Hilfe von Plugins realisiert und ist somit auch individuell einstellbar. Zudem kann die bestimmte Phase über einen Konsolenparameter gesteuert werden. Die Eingabe von z. B. mvn compile bewirkt den build-Prozess bis zu der Phase compile durchzuführen. Falls bestimmte Plugins für eine Phase nicht im lokalen Repository vorliegen, werden diese automatisch aus dem Remote-Repository geladen.

Suchen von Abhängigkeiten

Da die meisten Projekte immer eine Menge von Abhängigkeiten zu externen Bibliotheken aufweisen, bietet Maven die Verwaltung dieser in einem lokalen Repository an. Um nicht jede externe Bibliothek manuell in das Repository zu laden, bietet Maven weiterhin das Remote-Repository in dem sich viele Standard-Bibliotheken wie beispielsweise JUnit befinden. Um einen Überblick über die gesamte Menge der Abhängigkeiten zu behalten, bestehen sogenannte Suchmaschinen für das Maven-Repository. Bei der Ausarbeitung dieser Thematik wurde des häufigeren diese Webseite zur Suche von externen Bibliotheken verwendet.

Neueinsteiger-Tipps

Maven ist ein mächtiges Werkzeug das auf einen deklarativen Ansatz aufsetzt. Somit werden von Maven automatisch Annahmen getroffen, die dem Neueinsteiger nicht unbedingt gleich geläufig und bekannt sind. Um einen guten Einstieg in die Funktionsweise von Maven zu bekommen empfiehlt sich das von Maven bereitgestellte Tutorial Maven-in-5-Minute. Bei diesem kurzen Tutorial wird ein einfaches Java-Projekt mit der externen Abhängigkeit zu JUnit erstellt.

Zurück zur Werkzeugübersicht
Zurück zur CSI-Hauptseite