Grundlagen des Buildmanagement
Transcrição
Grundlagen des Buildmanagement
Grundlagen des BuildmanagementTools Apache Maven Seminararbeit im Studiengang Scientific Programming vorgelegt von Sinan Böcker Matr.-Nr.: 836951 am 15. Dezember 2011 an der Fachhochschule Aachen Erstprüfer: Zweitprüfer: Prof. Dr. rer. nat. Bodo Kraft Dipl.-Inf. Arne Rache Abstract 1 Abstract Die Folgende Seminararbeit „Grundlagen des Buildmanagement-Tools Apache Maven“ gibt einen Einblick in die Automatisierung des Build-Prozesses in der Softwareerstellung. Maven soll hierbei dem Entwickler möglichst viele Aufgaben abnehmen und diese automatisieren, wie beispielsweise das Erstellen, das Testen oder die Distribution der Software. Besonders bei großen Software-Projekten nimmt ein derartiges Automatisierungstool den Entwicklern viel Arbeit ab. In dieser Seminararbeit wird auf die Motivation der Nutzung, die Funktionsweise und eine Beispielkonfiguration von Maven eingegangen. Des Weiteren wird Maven mit dem populären Buildmanagement-Tool Apache Ant verglichen. Inhaltsverzeichnis 2 Inhaltsverzeichnis Abstract ............................................................................................................................................ 1 Inhaltsverzeichnis ............................................................................................................................. 2 1. 2. 3. 4. 5. Einleitung .................................................................................................................................. 3 1.1 Was ist Maven? ................................................................................................................. 3 1.2 Motivation für Buildmanagement ..................................................................................... 3 1.3 Maven Grundlagen ............................................................................................................ 4 Funktionsweise ......................................................................................................................... 7 2.1 Lifecycles ............................................................................................................................ 7 2.2 Plugins ................................................................................................................................ 9 2.3 POM ................................................................................................................................. 12 2.4 Repositories ..................................................................................................................... 14 Konfiguration .......................................................................................................................... 15 3.1 Anlegen eines Projektes .................................................................................................. 15 3.2 Erstellen des Projektes .................................................................................................... 16 3.3 Hinzufügen einer Abhängigkeit ....................................................................................... 16 3.4 Weitere Möglichkeiten .................................................................................................... 16 Vergleich mit Apache Ant ....................................................................................................... 18 4.1 Ant Grundlagen................................................................................................................ 18 4.2 Vergleich mit Maven........................................................................................................ 19 Fazit ......................................................................................................................................... 21 5.1 Zusammenfassung ........................................................................................................... 21 5.2 Ausblick ............................................................................................................................ 21 6. Literaturverzeichnis ................................................................................................................ 23 7. Eidesstattliche Erklärung......................................................................................................... 24 Einleitung 3 1. Einleitung Die vorliegende Seminararbeit behandelt das Buildmanagement-Tool Maven. Sie soll dem Leser eine Einführung in Maven bieten und diesen motivieren, es in Projekten zu nutzen. Das Thema „Grundlagen des Buildmanagement-Tools Maven“ wurde gewählt, da es in der Firma TravelTainment bei den meisten Projekten genutzt wird. Maven ist sehr verbreitet unter JavaEntwicklern. 1.1 Was ist Maven? Maven ist ein Buildmanagement-Tool, welches dem Entwickler bei Vorverarbeitung, Kompilierung, Testen und Verteilung von Software behilflich ist. Neben den BuildFunktionalitäten bietet Maven viele Projektrelevante Funktionen, wie das Erstellen von Berichten bzw. Reports oder das Generieren von Webseiten. 1.2 Motivation für Buildmanagement Eine der Herausforderungen bei großen Software-Projekten ist es, dem Entwickler so viel Zeit wie möglich zu geben, in der er produktiv am Projekt arbeiten kann. Dabei kann es dazu kommen, dass er von manuellen Updates, Integrierungen und Konfigurationen von Bibliotheken abgelenkt wird. Diese Ablenkungen entfallen mit Maven größtenteils durch verschiedenste Automatisierungen. Zusätzlich ist es mit Maven möglich neue Entwickler schnell produktiv in die Arbeiten an dem Projekt zu integrieren. Normalerweise dauert dies oft mehrere Stunden oder sogar Tage. Der Entwickler muss eingearbeitet werden und alle benötigten Resourcen, d.h. benötigte Pakete und Bibliotheken müssen beschafft werden. In der Regel muss ein Kollege dem Neuling helfen, wodurch dieser nicht produktiv arbeiten kann. Der Zeitaufwand den neuen Entwickler in Maven einzuarbeiten und dieses zu Konfigurieren ist meist um ein Vielfaches geringer als das manuelle Vorgehen. Neben der einfach zu erlernbaren Struktur und den vielen Automatisierungen der Buildprozesse, ist aber auch die Erweiterbarkeit von Maven wichtig. So lassen sich Einleitung 4 beispielsweise mit Hilfe der Plugins automatisiert JavaDocs1 oder Fehler-Reports erstellen, es muss also kein externes Tool dafür genutzt werden. Früher gab es viele Diskussionen um das richtige Vorgehen und genauso viele Ansätze für BuildKonzepte. Im Grunde waren diese Ansätze aber ineffizient, da keine Konventionen genutzt wurden. Im Laufe der Zeit wurden jedoch beispielsweise mit Maven Konventionen geschaffen. Die Bedeutung der Konventionen wird im nächsten Kapitel (1.3) verdeutlicht. Der Entwickler soll bei möglichst vielen Aufgaben unterstützt werden, welche im Idealfall sogar automatisiert werden. Maven lädt alle benötigten Pakete bei Bedarf aus einem zentralen Repository auf das lokale Repository des Entwicklers herunter, wodurch jeder Entwickler automatisch Zugriff auf alle benötigten und aktuellsten Konfigurationen und Bibliotheken hat. Eine genauere Erklärung von Repositories findet sich in Kapitel 2.4. 1.3 Maven Grundlagen Der Grundsatz von Maven ist „Konvention vor Konfiguration“. Das heißt, dass ein großer Teil der Strukturen vorgegeben ist. Der Entwickler muss nur die Teile des Projektes konfigurieren die nicht von Maven vordefiniert sind. Im Falle von Maven soll der Entwickler primär am eigentlichen Projektcode bzw. dem Inhalt des Projektes arbeiten, und möglichst wenig an Konfigurationen, Strukturen, oder Abläufen, die zur Kompilierung oder Veröffentlichung nötig sind. Die Konventionen äußern sich zum Beispiel in der Trennung des Projektcodes, dem Code der Unit-Tests und jeweils der Ressourcen. Diese Daten liegen immer in fest definierten Verzeichnissen. Obwohl es nicht ratsam ist vorgegebene Strukturen anzupassen, lässt Maven den Entwickler die meisten Vorgaben an die eigenen Bedürfnisse anpassen. Es ist beispielsweise möglich Projektverzeichnise anzupassen, oder den Ordnernamen zu ändern. Wenn keine manuellen Anpassungen vorgenommen wurden, hat jedes mit Maven erstellte Projekt die gleiche Verzeichnisstruktur. Dies macht die Projekte für erfahrene Maven-Entwickler sehr übersichtlich. Zusätzlich können dadurch Funktionen auf verschiedene Projekte angewendet werden, ohne Anpassungen vornehmen zu müssen. Dies bildet auch die Basis für das PluginSystem Mavens bildet. 1 Automatische Softwaredokumentation des Java-Sourcecodes Einleitung 5 simple/ simple/pom.xml /src/ /src/main/ /main/java /src/test/ /test/java Beispiel 1 - Die automatisch erstellte Verzeichnisstruktur Um Abhängigkeiten und Projektbeziehungen zu konfigurieren, nutzt Maven ein genau definiertes Projektmodell (POM – Project Object Model). Dieses wird in der Datei pom.xml gespeichert, die im Projektverzeichnis liegt. <project> <modelVersion>4.0.0</modelVersion> <groupId>com.mycompany.app</groupId> <artifactId>my-app</artifactId> <version>1.0</version> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> </project> Beispiel 2 - Ein minimales POM Das sogenannte Super-POM liefert Standard-Konfigurationen für Verzeichnisse und Plugins. Alle anderen POMs sind von der Super-POM abgeleitet, und erben damit alle darin definierten Eigenschaften. Maven verwendet ein lokales Verzeichnis, welches „lokales Repository“ genannt wird. In diesem werden Bibliotheken abgelegt, die zum Erstellen eines Builds2 benötigt werden. Werden weitere Bibliotheken oder neue Versionen von Bibliotheken benötigt, werden diese automatisch in das Repository kopiert bzw. aktualisiert. Dadurch entfällt die Notwendigkeit einer manuellen Verwaltung der Bibliotheken. 2 Erstellung eines Programmes aus dem Sourcecode Einleitung 6 Maven geht von immer wiederkehrenden Aufgaben aus. Daher werden fest definierte Lifecycles (Lebenszyklen) genutzt. Der Standard- Lifecycle ist der Build-Lifecycle, der die feste Reihenfolge enthält, die zur Erstellung eines Builds nötig ist. Da die Reihenfolge der Phasen von Maven feststeht, ist außerdem keine Analyse bzw. Erstellung von Build-Skripten nötig. Auf Lifecycles wird in Kapitel 2.2 genauer eingegangen. Maven basiert auf Java und kann insbesondere Java-Projekte (auch C#, Ruby, Scala usw.) standardisiert erstellen und verwalten. Das vollständige Super-POM kann auf der Maven-Homepage gefunden werden3. 3 http://maven.apache.org/ - 14.12.2011 Funktionsweise 7 2. Funktionsweise Maven hat ein fest definiertes Modell eines Projekts. Diese Modell ermöglicht: Abhängigkeits-Verwaltung Die Indentifizierbarkeit eines Projektes mittels Gruppenkennung, Artefaktkennung4 und Version ermöglicht eine Abhängigkeitsverwaltung. Repositories Die in den POMs angegebenen Abhängigkeiten machen es möglich, Sammlungen von Bibliotheken zu erstellen und diese den Nutzern zur Verfügung zu stellen. Dabei gibt es Remote-Repositories, welche Bibliotheken für den bzw. die Nutzer zur Verfügung stellt, sowie lokale Repositories, das Repository des jeweiligen Entwicklers. Das lokale Repository gleicht sich automatisch mit dem Remote-Repository ab. (evtl. Verweis auf Lifecycles, bzw. deren späterer Erläuterung) Wiederverwendung Ein einzelnes Plugin kann für verschiedene Zwecke genutzt werden. Siehe Kapitel 2.2. Integration Durch das genau definierte Modell können verschiedene Werkzeuge bzw. IDEs auf die gleichen Projektinformtionen zugreifen. Obwohl die IDEs unterschiedlich aufgebaut sind, lassen sich die Projektinformationen durch das Modell leicht auslesen. 2.1 Lifecycles Die Abarbeitung von bestimmten Arbeitsschritten, beispielsweise in Form von Plugins, in einer fest definierten Reihenfolge, nennt sich Lifecycle(Lebenszyklus). Maven basiert auf diesem Konzept der Lebenszyklen. Ein Lifecycle enthält alle Phasen die nötig für den Build-Vorgang sind. Ebenfalls definiert im Lifecycle ist die Distribution. Für den Entwickler bedeutet das, dass er sich keine breite Auswahl von Befehlen merken muss, sondern nur einige wenige. Die POM des Projektes sorgt für das Ergebnis. Standartmäßig enthält Maven drei Lifecycles: default, clean und site. Clean beseitigt alles was für das Projekt nicht direkt benötigt wird, beispielsweise die Kompilierten-Dateien des 4 Artefakt: Objekt in der Softwareentwicklung Funktionsweise 8 vorherigen Build-Vorgangs. Site ist zuständig für die Projektdokumentation. Auf den DefaultLifecycle wird im Folgenden genauer eingegangen. Der Default-Lifecycle enthält folgende Phasen: Validate Überprüft das Projekt auf Fehler und stellt sicher dass alle benötigten Informationen vorhanden sind. Compile Kompiliert den Sourcecode des Projekts. Test Testet den kompilierten Sourcecode, mit einem passenden Unit-Test-Framework (siehe „Surefire“ Kapitel 2.2). Für diese Tests muss das Projekt in der Regel nicht gepackt und deployed sein. Package Packt den kompilierten Sourcecode in das gewünschte Format. Ein Beispiel dafür wäre das Jar-Format. Integration-test Deployment in eine Testumgebung. Verify Testet ob das Paket valide ist und ob es den Qualitäts-Kriterien entspricht. Install Installiert das Paket im lokalen Repository, und kann dann lokal in anderen Proekten als Dependency genutzt werden. Deploy Kopiert das fertige Paket in das Remote-Repository, damit es für andere Entwickler und Projekte zur Verfügung steht. Build-Phasen eines Lifecycles werden sequentiell ausgeführt, die Reihenfolge untereinander ist nicht veränderbar. Wird eine Phase aufgerufen, werden automatisch alle vorher nötigen Phasen durchlaufen. Jede der Phasen besteht wiederum aus so genannten Goals (Deutsch: „Ziel“). Ein Funktionsweise 9 Goal hat eine ähnliche Aufgabe wie eine Phase, beide definieren eine bestimmte Aufgabe. Ein Goal führt jedoch eine bestimmte Funktionalität eines Plugins aus. Um also das Projekt in das Remote-Repository zu kopieren muss nur der Deploy-Befehl aufgerufen werden, womit automatisch alle anderen benötigten Schritte durchgeführt würden. Will der Nutzer beispielsweise seine Unit-Tests ausführen, müsste er den Test-Befehl aufrufen. Damit würden als erstes der Sourcecode validiert werden, dann der Sourcecode kompiliert werden und als letztes die Unit-Tests aufgerufen werden. 2.2 Plugins Das Grundgerüst von Maven hat wenige Funktionen. Maven wurde so konzipiert, dass die meisten Funktionen von Plugins geliefert werden. Die Grundfunktionen beinhalten etwa das Parsen von XML-Dateien, Plugin-Verwaltung und den Default-Lifecycle. Das heißt dass die Hauptverantwortung auf Plugins fällt. Zum Beispiel besitzt Maven keine Möglichkeit zum Ausführen von JUnit-Tests. Diese werden von einem Plugin durchgeführt, welches für die TestPhase zuständig ist. Auch andere wichtige Funktionen wie das Kompilieren des Projektes sind nicht Bestandteil der Grundfunktionen von Maven. Jede Phase kann von einem Plugin „ersetzt“ werden. Maven hat also verschiedene Aufgaben als Plugins ausgelagert. Dies hat den Vorteil, dass einzelne Plugins mit bestimmten Aufgaben weitaus leichter zu Warten und Einzusetzen sind, als große Bibliotheken. Der Nutzer muss nichts tun um Updates der Plugins zu erhalten, da dies von Maven geregelt wird. Das heißt gleichzeitig auch dass der Nutzer in seinem Projekt so gut wie keine Anpassungen am Projektcode machen muss um neuen Code zu unterstützen, vorrausgesetzt die Abwärtskompatibilität des Plugins ist erhalten geblieben. Die einzige Benötigte Anpassung ist die Versionsnummer des jeweiligen Plugins in der Projekt-POM. Wird in der POM eine neue Version eingetragen, wird diese automatisch ins lokale Repository heruntergeladen und benutzt. Ein bekanntes Beispiel für ein Plugin ist das Surefire-Plugin, welches für die Auführung von UnitTests zuständig ist. Es ermöglicht unter anderem JUnit3- und JUnit4-Tests, sowie TestNG-Tests. Funktionsweise 10 Hierbei wurde sehr auf Abwärtskompatibilität geachtet, damit beispielsweise Nutzer von JUnit3Tests diese auch weiterhin ohne Anpassungen nach einem Update weiternutzen können. Durch dieses Plugin-Konzept ist es leicht möglich Maven um weitere Funktionalitäten zu erweitern. Nachfolgend einige populäre Maven-Plugins: Clean Das „Clean“-Plugin hat die Aufgabe, die Dateien und Verzeichnisse, die Maven während dem Builden generiert, zu löschen. Das „Clean“-Plugin ist an die Clean-Phase gebunden, kann jedoch auch manuell aufgerufen werden. Compiler Das „Compiler“-Plugin ist zuständig für die Kompilierung des Quellcodes. Der Standardcompiler ist dabei javac, es können allerdings auch beispielsweise die Compiler von .NET oder C# genutzt werden. Deploy Das “Deploy” –Plugin wird hauptsächlich während der Deploy-Phase (siehe Kapitel 2.1) genutzt. Es ist dafür zuständig, die Artefakte des Entwicklers einem Remote-Repository (siehe Kapitel 2.4) hinzuzufügen, um es anderen Entwicklern zur Verfügung zu stellen. Eclipse Das “Eclipse”-Plugin ermöglicht es, aus dem Maven-Projekt ein Eclipse-Projekt zu generieren. Install Das “Install”-Plugin fügt Artefakte aus dem Remote-Repository (siehe Kapitel 2.4) zum lokalen Repository hinzu. Dazu nutzt es die Informationen aus der Projekt-POM. Surefire Das “Surefire”-Plugin führt während der Test-Phase die Unit-Tests aus. Zusätzlich generiert es jeweils einen Report. Jar Das “Jar”-Plugin ermöglicht das Erstellen und Signieren von Jar-Dateien. Funktionsweise 11 JavaDoc Das “JavaDoc”-Plugin erstellt automatisch eine Dokumentation des Sourcecodes in Form von JavaDocs für das jeweilige Projekt. Das Ergebnis ist eine HTMLDokumentationsdate. Funktionsweise 12 2.3 POM Die Datei pom.xml enthält das Projekt Objekt Modell eines Projektes (Project Object Model – POM). Die POM enthält alle relevanten Informationen über ein Projekt. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.mycompany.app</groupId> <artifactId>my-app</artifactId> <packaging>jar</packaging> <version>1.0-SNAPSHOT</version> <name>Maven Quick Start Archetype</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> </project> Beispiel 3 - Beispiel POM (Siehe Kapitel 3.1) Dies ist eine sehr simple POM, enthält jedoch die Elemente die jede POM enthalten muss. Im Folgenden eine kurze Erklärung der einzelnen Elemente: project: Das Top-Level Element dass jede POM besitzt. modelVersion: Beschreibt die Version des genutzten Objekt Modells der POM. groupId: Enthält eine einzigartig identifizierbare ID der Gruppe, die an dem Projekt arbeiten. Meist besteht die groupId auf einer Domain einer Firma. artifactId: Dieses Element enthält eine einzigartig identifizierbare ID des jeweiligen Projekts pro groupId. packaging: Zeigt an wie das kompilierte Projekt gepackt werden soll. Beispiele dafür sind JAR, WAR oder EAR. version: Beschreibt die aktuelle Version des Projektes. Maven unterstützt die Entwickler bei der Versionierung, das heißt dass diese meist automatisch hochgestuft wird. Funktionsweise 13 name: Beschreibt den Namen des Projektes. url: Enthält die URL der Projektseite. Wird meist für die von Maven generierte Dokumentation genutzt. Description: Eine kurze Beschreibung des Projekts. Die so genannten Dependencies stellen die Abhängigkeiten des Projekts dar. Eine Dependency zeigt eine externe Bibliothek an, welches von dem Projekt benötigt wird. Maven würde diese dann in das lokale Repository kopieren, damit es lokal nutzbar ist. Ein POM kann beliebig viele Dependencies enthalten. Zusätzlich ist eine Vererbung von POMs möglich. Das heißt dass eine POM ein Parent-POM besitzen kann, dessen Attribute dann alle geerbt werden. Eine Beispielhafte Projektabhängigkeit wird in Abbildung 1 dargestellt. Zusätzlich wird verdeutlicht, dass auch Plugins Abhängigkeiten von anderen Bibliotheken haben können. Abbildung 1- Beispielhaftes Diagramm für Abhängigkeiten des Open-Source-Tools Shindig 5 http://shindig.apache.org – 14.12.2011 5 Funktionsweise 14 2.4 Repositories Maven nutzt zur Abhängigkeitsverwaltung eine bestimmte Verzeichnisstruktur, welche sich Repository nennt. Es wird zwischen dem lokalen- und dem (entfernten) Remote-Repository unterschieden. Wird während des Build-Vorgangs eine Abhängigkeit entdeckt, versucht Maven die benötigten Dateien im lokalen Repository zu finden. Werden sie dort gefunden, werden sie ohne in das Projektverzeichnis kopiert zu werden, genutzt. Können die Abhängigkeiten nicht mit Hilfe des lokalen Repositorys aufgelöst werden, wird das sogenannte Remote-Repository genutzt. Ein Remote-Repository kann entweder öffentlich im Internet zugänglich sein, oder privat in einem Intranet Beispielsweise von einer Firma. Findet Maven die benötigten Dateien im Remote-Repository, werden diese in das lokale Repository kopiert und können ab diesem Zeitpunkt lokal genutzt werden. Das heißt, dass das lokale Repository ein Cache des Remote-Repositorys. Zusätzlich beinhaltet das lokale Repository jedoch noch Artefakte die vom Nutzer erstellt, aber noch nicht released wurden. Ein Projekt kann auch auf mehrere Remote-Repositories zugreifen. Diese werden dann nacheinander nach den benötigten Daten durchsucht. Die Abhängigkeiten, also die benötigten Bibliotheken eines Projektes werden in der Datei pom.xml definiert (siehe Kapitel 2.3). Ein Beispiel für ein bekanntes öffentliches Remote-Repository ist das öffentliche Repository von Apache6. Es gibt drei Arten von Repositories, die jeweils in dem POM definiert werden: repositories Ein Repository für Dependencies pluginRepositories Ein Repository für Plugins distributionManagement Ein Repository für das Deployment, also ein Ziel-Repository 6 central:http://repo1.maven.org/maven/ Konfiguration 15 3. Konfiguration Eine Anleitung, wie Maven installiert werden muss, findet sich auf der Maven Homepage7. ist Maven installiert, kann per Kommandozeilenbefehl mvn –v getestet werden ob alles geklappt hat. Kommandozeilenbefehle werden im folgenden mit fettem Text markiert. mvn ist der Aufruf von Maven, alles Nachfolgende sind Parameter. Apache Maven 3.0.3 (r1075438; 2011-02-28 18:31:09+0100) Maven home: C:\Program Files\apache-maven-3.0.3 Java version: 1.6.0_27, vendor: Sun Microsystems Inc. Java home: C:\Program Files\Java\jdk1.6.0_27\jre Default locale: de_DE, platform encoding: Cp1252 OS name: "windows 7", version: "6.1", arch: "amd64", family: "windows" Beispiel 4 - Beispielhafte Augabe des Befehls mvn -v 3.1 Anlegen eines Projektes Um ein neues Projekt anzulegen, muss in der Kommandozeile folgender Befehl eingegeben werden: mvn archetype:generate \ DarchetypeGroupId=org.apache.maven.archetypes \ DgroupId=com.mycompany.app \ -DartifactId=my-app Beispiel 5 - Eingabe zur Erstellung eines neuen Projektes archetype:generate steht für ein Maven-Goal (siehe Kapitel 2.1). Ein Maven-Goal ist in etwa gleichbedeutend mit einem Ant-Target (siehe Kapitel 4.1). Die restlichen Werte sind Argumente die für das Goal relevant sind. Archetypes sind Templates von Projekten8, die Beispielimplementierungen für bestimmte Programmtypen liefern. Mitgeliefert mit Maven werden viele verschiedene Archetypen, von einer simplen Anwendung bis hin zum komplexen Web-Tool. Nachdem der Befehl ausgeführt wurde fällt auf, dass ein Verzeichnis namens „my-app“ erstellt wurde, welches das neue Projekt enthält. Zusätzlich enthält das Verzeichnis eine automatisch 7 8 http://maven.apache.org/download.html - 13.12.2011 http://maven.apache.org/guides/introduction/introduction-to-archetypes.html - 13.12.2011 Konfiguration 16 erstellte pom.xml. Die in diesem Beispiel erstellte POM ist in Kapitel 2.3 zu finden. Die erzeugten Verzeichnisse halten sich an das Maven Standard Layout. Wie schon beschrieben wird der Sourcecode des Projekts in einem anderen Verzeichnis gesichert als die Unit-Test-Dateien. 3.2 Erstellen des Projektes Um nun das erstellte Projekt zu erstellen und zu paketieren, muss im Verzeichnis des Projekts der Befehl mvn install aufgerufen werden. Wurde dieser Befehl aufgerufen, findet sich im Unterverzeichnis „Target“ des Projektverzeichnisses die Datei „my-app-1.0-Snapshot.jar“. Diese Datei kann dann als Javaprogramm ausgeführt werden. Mit dem Befehl mvn install wird das erstellte Projekt kompiliert, getestet, paketiert und anschließend im lokalen Repository installiert. 3.3 Hinzufügen einer Abhängigkeit Will der Nutzer nun eine Bibliothek nutzen, die in einem Remote-Repository verfügbar ist, muss er sein POM ergänzen. Dann wird das jeweilige Artefakt9 automatisch in das lokale Repository geladen und kann genutzt werden. Im Folgenden ein Beispiel: <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.12</version> </dependency> Beispiel 6 - Beispiel Dependency In diesem Beispiel wird die Logging-Bibliothek log4j in der Version 1.2.12 heruntergeladen, wird in das Verzeichnis log4j/log4j/1.2.14/ des lokalen Repositories kopiert und kann somit genutzt werden. 3.4 Weitere Möglichkeiten Weitere mögliche Befehle sind den Phasen des Default-Lifecycles ähnlich. Es gibt für die meisten Phasen Befehle, die diese Ausführen. Im folgenden sind die wichtigsten beschrieben. 9 Kompilieren Vom Nutzer erstelltes, kompiliertes und packetiertes Programm Konfiguration 17 o mvn compile – Der Ordner target/classes/ wird im Projektverzeichnis angelegt und die Klassen aus dem Ordner src/main/java/ werden dort hinein kompiliert. Unit-Tests ausführen o mvn test – Der Ordner target/test-classes wird im Projektverzeichnis angelegt. Daraufhin werden alle Testklassen kompiliert und in besagten Ordern verschoben. Anschließend werden die Unit-Tests ausgeführt. Packen/Installieren o mvn package – Erzeugt die Ausführbare JAR-Datei des Projekts o mvn install – siehe Kapitel 3.2 Aufräumen o mvn clean – Alle für den Build-Vorgang benötigten Dateien werden gelöscht. Praktisch bedeutet das, dass der Target Ordner im Projektverzeichnis gelöscht wird. Die Verschiedenen Aufrufe lassen sich teilweise auch kombinieren. Das bekannteste Beispiel ist dabei mvn clean package. Bei diesem Aufruf wird erst der clean-Befehl ausgeführt, und dann der package-Befehl. Das bedeutet, dass der Target-Ordner gelöscht wird, und anschließend das Projekt neu kompiliert, getestet und packetiert wird. Vergleich mit Apache Ant 18 4. Vergleich mit Apache Ant Das folgende Kapitel soll eine kurze Einführung in Apache Ant geben. Daraufhin soll Apache Ant mit Apache Maven verglichen werden. Allerdings wird nur die Buildmanagement-Funktion von Maven für den Vergleich genutzt, da Ant keine Möglichkeit für Plugins bietet und somit auch keine Management-Funktionen wie Maven. 4.1 Ant Grundlagen Im Gegensatz zu Maven, welches über weitere Fähigkeiten verfügt, ist Ant ein Werkzeug welches exklusiv für das automatisierte Builden von Quelltexten zuständig ist. Ant ist ein Apronym für „Another Neat Tool“ und wird seit 1999 entwickelt. Außerdem ist Ant Open Source und in Java geschrieben. Gesteuert wird Ant von der sogenannten build.xml-Datei, auch genannt Build-Datei. In dieser Projekt-Datei wird ein Projekt definiert, welches Targets (Ziele) enthält. Targets sollen so viele Tätigkeiten, Beispielsweise das Builden, wie möglich abdecken, die bei einem Software-Projekt anfallen. Zwischen diesen Targets können Abhängigkeiten zu anderen Targets definiert werden, welche beim Aufruf von Ant aufgelöst und abgearbeitet werden. Hat ein Target eine Abhängigkeit zu einem oder mehreren anderen Targets, muss nur dieses aufgerufen werden um alle notwendigen Schritte abzuarbeiten. <target name="build" depends="clean" description="Baut die komplette Anwendung"> Beispiel 7 - Beispiel Target An diesem Beispiel erkennt man gut die Abhängigkeiten. Damit das Ziel „build“ ausgeführt wird, muss erst „clean“ ausgeführt werden. Ein Target besteht wiederum aus Tasks (Aufgaben). Tasks sind vergleichbar mit Funktionen in Programmiersprachen. Insgesamt verfügt Ant über mehr als 150 Tasks, Beispiele dafür sind copy, delete oder move. <!-- Verzeichis anlegen --> <mkdir dir="${build.classes}"/> Beispiel 8 - Beispiel Task Vergleich mit Apache Ant 19 "${build.classes}" stellt hier eine Variable dar, die vorher per <property name="build.classes" value="bin" /> Beispiel 9 - Beispiel Property definiert wird. In diesem Fall soll das Verzeichnis “bin” angelegt werden. Daran sieht man dass genaue Vorgaben braucht. Es muss zum Beispiel genau vorgegeben bekommen in welchem Verzeichnis welche Information liegt, da es diesbezüglich keinerlei Standardinformationen vorgegeben hat. 4.2 Vergleich mit Maven Ant kennt im Gegensatz zu Maven keine Konventionen für eine Verzeichnisstruktur oder für Vorgänge. Im Build-Skript von Ant muss manuell definiert werden, wo sich der Sourcecode befindet, wo sich das Ausgabeverzeichnis befinden soll und in welcher Reihenfolge die Befehle ausgeführt werden sollen. Ant geht also prozedural vor. Maven geht deklarativ vor. Im Falle von Maven bedeutet dies, dass alle Strukturen bereits bestehen, und der Entwickler nur den Inhalt füllt. Der Entwickler muss nur die pom.xml erzeugen und die Daten (Projektsourcen, Unit-Tests) im jeweiligen Standard-Verzeichnis abgelegen. Der Rest, also der Build-Vorgang, das Kompilieren usw. geschieht dann ohne zutun des Nutzers. Zudem kennt Ant keine Lebenszyklen. Mit Ant müssen Targets und deren Abhängigkeiten definiert und die Abfolge aller Schritte im Build-Script muss manuell festgelegt werden. Maven führt wiederum eine Reihe von fest definierten Abläufen durch (siehe Lifecycles, Kapitel 2.1). Theoretisch müsste sich ein Maven-Nutzer nur einen einzigen Befehl merken, da alle vorherigen Schritte automatisch abgearbeitet werden. Ein Ant-Nutzer müsste für den gleichen Effekt ein ganzes Skript schreiben. Im Grunde muss ein Ant-Nutzer für jede anfallende Aufgabe ein eigenes Skript erstellen. Möchte ein Nutzer mit Maven nur sein Projekt testen, muss er nur den Test-Befehl aufrufen. Alle nötigen Schritte werden hierbei automatisch erledigt. Ant hat jedoch gegenüber Maven den Vorteil der Freiheit, die der Entwickler des Build-Skriptes hat. Der Entwickler kann frei entscheiden was das Skript machen soll und in welcher Reihenfolge dies geschehen soll. Maven hat hier das „Problem“ der festen Struktur, wodurch einige Freiheiten verloren gehen. Vergleich mit Apache Ant 20 Maven profitiert hier von der einfacheren Nutzbarkeit. Der Nutzer muss im Grunde nichts manuell konfigurieren und kann sich der Entwicklung widmen. Ant hat den großen Nachteil dass keine Repositories genutzt werden können. Dadurch muss der Nutzer bei Bedarf alle Bibliotheken manuell updaten. Trotzdem schließen sich Maven und Ant nicht gegenseitig aus. Wurden zum Beispiel bereits sehr komplexe Skripte für Ant geschrieben, oder sollen Probleme gelöst werden, in einer Art die sich nicht an die Normen von Maven hält, können diese Skripte auch in Maven genutzt werden. Ant wird in Form eines Maven-Plugins eingebunden. Es können also Maven-Plugins in Ant geschrieben sein oder bestimmte Phasen des Lifecycles Ant-Skripte ausführen. Nicht zu verwechseln mit der erleichterten Integration von neuen Entwicklern in ein Projekt ist die generelle Erlernbarkeit der Tools. Muss sich ein Entwickler in Maven einarbeiten, muss dieser sich alle Strukturen, Funktionen und Möglichkeiten einprägen. Dies kann durchaus Zeit in anspruch nehmen. Im Gegensatz dazu nutzt Ant in seinen Build-Skripten eine Programmiersprachen ähnliche Syntax. Dadurch wird es einem Entwickler erleichtert sich in Ant einzuarbeiten, da dieses schon bekannten Strukturen ähnelt. Fazit 21 5. Fazit Dieses Kapitel soll diese Seminararbeit kurz zusammenfassen und einen Ausblick bieten, was mit Maven noch möglich ist, da diese Seminararbeit sich auf den Buildmanagement-Aspekt Mavens konzentriert hat. 5.1 Zusammenfassung In der vorliegenden Arbeit wurde dem Leser eine Einführung in die Builmanagement-Aspekte des Tools Apache Maven gegeben. Die Kapitel 1 und 2 sollen dem Leser den theoretischen Hintergrund von Maven erklären. Kapitel 3 wendet sich der technischen Seite, bzw. der Realisierung eines Projektes zu. In Kapitel 3 wurde ein Vergleich mit dem wohl verbreitetsten Konkurenztool Apache Ant vorgenommen. 5.2 Ausblick Maven ist nach 9 Jahren10 immer noch in aktiver Entwicklung, das heißt, dass das noch kontinuierlich neue Funktionen hinzukommen. Momentan ist Maven in der Version 3.0.311 verfügbar. Bei den Arbeiten an Version 3 ist es den Entwicklern besonders wichtig, eine größtmögliche Kompatibilität zu Maven 1 bzw. Maven 2 zu ermöglichen. Die meisten Projekte werden bei einem Update auf Maven 3 keine Umstellungen benötigen. In der neuen Version wurden zudem etliche Funktionen im Kern von Maven neugeschrieben, zusätzlich wurden kompatible Sprachen wie Ruby hinzugefügt. In einem neuen experimentellen Feature werden Multi-Core-Prozessoren unterstützt. Damit wird die Last des Build-Vorgangs auf mehrere Kerne aufgeteilt. Mit Hilfe von Server-Tools wie Jenkins12 ist es möglich, in bestimmten Abständen automatisch den Build-Vorgang zu starten. Dieses Vorgehen fällt in den Bereich der Kontinuierlichen Integration. Am bekanntesten ist hierbei der so genannte Nightly-Build, bei dem jede Nacht ein neuer Build erstellt wird. Bei diesem Vorgang soll automatisch getestet, kompiliert und eventuell sogar auf das Zielsystem deployed werden. Dies hat mehrere Vorteile. Zum einen gibt es dadurch regelmäßige Tests, da bei jedem Build-Vorgang kompiliert und die Unit-Tests 10 In aktiver Entwicklung seit 2002 Stand Dezember 2011 12 Webbasiertes System für kontinuierliche Integration für beispielsweise Maven Projekte. 11 Fazit 22 durchlaufen werden. Zum anderen gibt es jeden Tag (oder ein anderer eingestellter Zeitraum) eine aktuelle Version die ausführbar, und damit produktiv testbar ist. Die oft gelobten Konventionen von Maven, die dem Nutzer zwar Arbeit abnehmen, nehmen dem Nutzer jedoch auch einen erheblichen Teil an Freiheit. Genau diese Freiheit ist ein Vorteil von Apache Ant. Ant-Skripte können zwar auch mit Maven ausgeführt werden, was ein vollständiges Build-Skript jedoch nicht ersetzt. Mit Apache Ivy gibt es mittlerweile ein Konkurenztool für Maven, auf der Basis von Apache Ant13. Apache Ivy erweitert Apache Ant um Buildmanagement-Aspekte. Mit Ivy bekommt Ant so die Möglichkeit Repositories zu nutzen, womit Maven einen seiner größten Vorteile verliert. Da jedoch Ivy noch nicht so lange in Entwicklung ist wie Maven gibt es für dieses Tool deutlich weniger Repositories. In absehbarer Zeit wird Maven das verbreitetste Buildmanagement-Tool mit vergleichbarem Funktionsumfang bleiben. Die Konkurrenzprodukte wie Ivy, Gradle oder Buildr sind noch nicht ausgereift oder verbreitet genug um Maven zu ersetzen. Mittlerweile wird Maven von vielen Firmen und Open-Source-Projekten genutzt wodurch die Anzahl der verfügbaren Plugins und Repositories stetig wächst. Ein Vergleich aus dem Jahre 200514 zeigt, dass es zu diesem Zeitpunkt bereits mehr als 8000 verfügbare Bibliotheken im Maven Repository gab. Zur selben Zeit gab es im Ivyrep nur etwa 30 Bibliotheken. 13 14 Seit 2004 http://docs.codehaus.org/display/MAVEN/Feature+Comparisons – Stand 13.12.2011 Literaturverzeichnis 23 6. Literaturverzeichnis Apache Ant Project. (kein Datum). Abgerufen am 14.12.2011 von http://ant.apache.org/ Apache Maven Project. (kein Datum). Abgerufen am 13.12.2011 von http://maven.apache.org/ Ivy - The agile dependency manager. (kein Datum). Abgerufen am 14.12.2011 von http://ant.apache.org/ivy/ Jenkins. Abgerufen am 14.12.2011 von http://jenkins-ci.org/ Spiller, M. (2009). Maven 2 Konfigurationsmanagement mit Java. mitp. Thomas Locher, T. O. (kein Datum). Maven Guide. Abgerufen am 13.12.2011 von http://www.scribd.com/doc/17571160/Maven-Guide-German Eidesstattliche Erklärung 24 7. Eidesstattliche Erklärung Hiermit versichere ich, dass ich die Seminararbeit mit dem Thema „Grundlagen des Buildmanagement-Tools Apache Maven“ selbstständig verfasst und keine anderen als die angegebenen Quellen und Hilfsmittel benutzt habe, alle Ausführungen, die anderen Schriften wörtlich oder sinngemäß entnommen wurden, kenntlich gemacht sind und die Arbeit in gleicher oder ähnlicher Fassung noch nicht Bestandteil einer Studien- oder Prüfungsleistung war. Name: Sinan Böcker Aachen, den 14.12.2011 Unterschrift der Studentin / des Studenten