Komponenten-basierte Entwicklung Teil 3: Einführung in Maven Komponenten – WS 2014/15 – Teil 3/Maven 20.10.14 1 Literatur und Web [3-1] Maven by Example http://www.sonatype.com/resources/books/maven-by-example/download Oder die Vorversion: http://www.filibeto.org/~aduritz/truetrue/mvn/maven-by-example0.7.pdf [3-2] Maven – the complete Reference http://www.sonatype.com/resources/books/maven-the-completereference/download [3-3] Better Builds with Maven http://www.iproving.ca/download/Technologies/Maven/Maven+Resources/BetterBuilds WithMaven-1.0.2.pdf [3-4] Maven 3.0 http://www.torsten-horn.de/techdocs/maven.htm [3-5] Behrendt, Mario: Jenkins. Kurz&Gut, O'Reilly, 20111 Komponenten – WS 2014/15 – Teil 3/Maven 2 Maven – Ein Projekt-Management-Werkzeug • Maven (Sammler des Wissens) • In Maven werden die Prozesse zum Generieren von Applikationen definiert; dies erfolgt deklarativ. • Web: – http://de.wikipedia.org/wiki/Apache_Maven – http://maven.apache.org/ – http://mvnrepository.com/ (Repository) • Aktuelle Version: 3.2.3 • Download: http://maven.apache.org/download.cgi • Für (sehr) viele Anwendungen gibt es Plugins, die die eigentliche Aufgabe realisieren. Komponenten – WS 2014/15 – Teil 3/Maven 3 Maven – Funktionen I • Steuerung folgender Prozesse: – Übersetzen – Testen – Zusammensetzen (Build) • Maven ist unabhängig von der Programmiersprache. • Neben der Herstellung einer lauffähigen Version der betreffenden Software werden noch Dokumentationen, z.B. javadoc, erzeugt. • Die Arbeit erfolgt unmittelbar durch Aufruf von mvn über die Shell-Schnittstelle Es gibt Plugins für Eclipse und netbeans. – http://wiki.netbeans.org/Maven – http://maven.apache.org/eclipse-plugin.html • Wer über einen Server dies im Hintergrund ablaufen lassen möchte, was für große Projekte geboten ist, der benutze Jenkins. http://jenkins-ci.org/ Komponenten – WS 2014/15 – Teil 3/Maven 4 Maven – Funktionen II • Beachtung und Verwaltung der Abhängigkeiten (Dependency Management) • Globales Repository für – Plugins Diese werden auch Mojos genannt Mojo = Maven (plain) old Java Object – Notwendige Software-Komponenten in den entsprechenden Versionen, z.B. mockito oder hamcrest • Aufgrund der Implementierung in Java sind alle Spezifikationen der Software in Maven portabel. Komponenten – WS 2014/15 – Teil 3/Maven 5 Installation I - Windows • Herunterladen der neuesten Version, z.B. 3.2.3 • Auspacken und den Ordner an die Stelle bewegen, wo er installiert sein soll, z.B. „D:\Java\apache-maven-3.2.3". • Durchsuchpfad für Kommandos auf den bin-Ordner setzen: am besten global: Systemsteuerung>System> Erweiterte Systemeinstellungen> Umgebungsvariablen> Systemvariablen Komponenten – WS 2014/15 – Teil 3/Maven 6 Installation II - Windows • Die Variablen JAVA_HOME und M2_HOME anlegen: – – – – JAVA_HOME anlegen und auf JDK-Ordner setzen M2_HOME anlegen und auf Maven-Ordner setzen z.B. JAVA_HOME auf C:\Program Files\Java\jdk1.8.0_20 M2_HOME auf D:\Java\apache-maven-3.2.3 • PATH mit ";%JAVA_HOME%\bin;%M2_HOME%\bin" erweitern • Das Ganze wird mit einem neu gestarteten(!) MSDOS-EingabeFenster mit dem Kommando set geprüft. Im MSDOS-Fenster set eingeben und sehen ob der Pfad gesetzt ist. Komponenten – WS 2014/15 – Teil 3/Maven 7 Installation III - Windows • Prüfung von PATH: • Letzter Test mit „mvn -v": Komponenten – WS 2014/15 – Teil 3/Maven 8 Installation IV - Linux • Die Installation auf Linux verläuft analog, nur dass der Mechanismus des Setzens der PATH-Variablen anders ist. • Z.B. für den bash in .bashrc oder .profile: – export JAVA_HOME=... – export M2_HOME=... – export PATH=$PATH:$JAVA_HOME/bin:$M2_HOME/bin Infos für beide Betriebssysteme: http://maven.apache.org/download.cgi#Installation Komponenten – WS 2014/15 – Teil 3/Maven 9 Archetypes – Projekt-Templates • Es sind Projekt-Templates für typische Projektarten definiert • Diese Templates installieren Basisversionen, die dann weiter entwickelt werden • Es gibt sehr viele archetypes, z.B. für Web-Anwendungen, ScalaProjekte etc. • Jedes Projekt kann eigene Templates entwerfen und der Welt zur Verfügung stellen • Zur Erzeugung wird das Plugin archetype benutzt: mvn archetype:generate Komponenten – WS 2014/15 – Teil 3/Maven 10 Hallo world! in Maven I mvn archetype:generate -DgroupId=de.htw_berlin.f4.kbe.hallo -DartifactId=hello -Dpackage=de.htw_berlin.f4.kbe -Dversion=1.0-SNAPSHOT -Dfilter=maven-archetype-quickstart • In den richtigen Ordner zur Installation gehen. • Nach der obigen Eingabe in einer Zeile werden viele Module herunter geladen. • Aus der Liste mit einem fehlerhaften(!) Filter-Parameter wird das Archetyp "maven-archetype-quickstart" ausgewählt – das wird dann als einziges angeboten, wenn das Filtern scheitert (was ja erwünscht ist). Es wird interaktiv 1 eingegeben (Nummern der Archetypen). Es gibt sehr viele Archetypen. • Ein Bindestrich in der DNS-Adresse muss durch ein _ ersetzt werden. Komponenten – WS 2014/15 – Teil 3/Maven 11 Erläuterungen • -D leitet einen Parameter ein, der ein Attribut festlegt. Alle in diesem Beispiel aufgeführten Parameter können weggelassen werden; die entsprechenden Werte werden dann interaktiv abgefragt. • -Dfilter=... definiert einen Parameter, der alle im Repository vorhandenen archtetypen – dies sind so ca. 1200 – filtert. Nur die gefilterten werden zur Auswahl angeboten. • Wenn kein Archetyp gefunden wird, wird immer der Archetyp "maven-archetype-quickstart" angeboten – was hier gewollt wurde. • Alle Archetypen haben eine mit der Zeit sich ändernde Nummer, so dass immer interaktiv gearbeitet werden muss. Komponenten – WS 2014/15 – Teil 3/Maven 12 Hallo world! in Maven II Eingabe 1 Eingabe 2 Eingabe 3 Komponenten – WS 2014/15 – Teil 3/Maven 13 Hallo world! in Maven III Und nun der Schluss Komponenten – WS 2014/15 – Teil 3/Maven 14 Hallo world! in Maven IV Initial aufgebaute Ordnerstruktur Komponenten – WS 2014/15 – Teil 3/Maven 15 Hallo world! in Maven V package de.htw_berlin.f4.kbe; /** * Hello world! * */ public class App { public static void main( String[] args ) { System.out.println( "Hello World!" ); } } Ordnerinhalt von kbe Komponenten – WS 2014/15 – Teil 3/Maven 16 Hallo world! in Maven VI Ordnerinhalt von hello Inhalt von pom.xml – Erster Teil (01) <project xmlns="http://maven.apache.org/POM/4.0.0" (02) xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" (03) xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 (04) http://maven.apache.org/xsd/maven-4.0.0.xsd"> (05) <modelVersion>4.0.0</modelVersion> Komponenten – WS 2014/15 – Teil 3/Maven 17 Hallo world! in Maven VII – pom.xml (06) (07) (08) (09) <groupId>de.htw_berlin.f4.kbe.hallo</groupId> <artifactId>hello</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> (10) (11) <name>hello</name> <url>http://maven.apache.org</url> Koordinaten (12) <properties> (13) <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> (14) </properties> (15) <dependencies> (16) <dependency> (17) <groupId>junit</groupId> (18) <artifactId>junit</artifactId> (19) <version>3.8.1</version> (20) <scope>test</scope> (21) </dependency> (22) </dependencies> (23) </project> Komponenten – WS 2014/15 – Teil 3/Maven Abhängigkeiten 18 Erläuterungen I • • • • Zeilen 1-4: Angabe der Grammatik sowie der Namensräume Zeile 5: Version der POM Zeilen 6-9: Identifizierung des Projektes Zeilen 12-13: Angabe der Projekteigenschaften, ohne die Kodierung nach UTF-8 kommen Fehlermeldungen, siehe dazu: http://maven.apache.org/general.html • Zeilen 15-22: Liste der Abhängigkeiten zu anderen Plugins, hier JUnit Komponenten – WS 2014/15 – Teil 3/Maven 19 Erläuterungen II - Koordinaten • Koordinaten = Zusammensetzung von Informationen über das Projekt zur eindeutigen Identifizierung • Die Koordinaten bestehen aus – groupId Identifier als Name einer Gruppe/Zusammenfassung mehrerer Artefakte, in der Regel Klassenkomplexe oder Programme Üblich ist ein Name ähnlich dem Paketnamen in Java – artifactId Identifier als Name des Artifakts, meist eines Programms. Der Dateiname wird meist nach folgendem Schema aufgebaut: <artifactId>-<version>.<packaging> – version gibt die Version nach folgendem Schema an: <Major>.<Minor>.<Bugfix>-<Qualifier>-<Buildnumber> Für unfertige Versionen ist der Qualifier SNAPSHOT – Packaging Typ des Pakets, z.B. jar, ear, war oder pom Komponenten – WS 2014/15 – Teil 3/Maven 20 Erläuterungen III - Abhängigkeiten (16) (17) (18) (19) (20) (21) <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> Wenn eine Abhängigkeit definiert ist und das entsprechende Ziel erreicht werden soll, werden alle fehlende Bibliotheken, POM-Dateien etc. aus den Repository herunter geladen und lokal abgespeichert. Dies dauert beim ersten Mal etwas, danach geht es sehr schnell. Komponenten – WS 2014/15 – Teil 3/Maven 21 Hallo world! in Maven VIII • Es wurde noch im Ordner HOMEDIR/.m2 ein Repository angelegt. • Dort sind auch alle zum Start herunter geladenen Dateien vorhanden, so dass ein erneutes Laden entfällt. Komponenten – WS 2014/15 – Teil 3/Maven 22 Typische Verzeichnisstruktur (Auszug) project home = {baseDir} Wurzel mit der POM-Datei {baseDir}/src/main/java Quellen der Java-Software entsprechend dem Paketnamen in Unterordner verteilt {baseDir}/src/main/resources Property-Dateien etc. {baseDir}/src/test/java Klassen zum Testen, z.B. Junit-Klassen {baseDir}/src/test/resources Property-Dateien und weitere Dateien, die für das Testen notwendig sind Komponenten – WS 2014/15 – Teil 3/Maven 23 Convention over Configuration I • Maven basiert auf einem allgemeinen für fast alle Anwendungsfälle geeigneten Modell über den Prozess der Erstellung von Software. • Bei jedem Teil dieses Modells wurden die Default-Einstellungen so gewählt, dass keine bis kaum Anpassungen notwendig sind. Das steckt hinter dem Motto Convention over Configuration. • Die Konfiguration erfolgt durch eine XML-Datei, die an der Wurzel der zu behandelnden Software liegt. • Diese XML-Datei heißt pom.xml. POM = Project Object Modell Komponenten – WS 2014/15 – Teil 3/Maven 24 Convention over Configuration II • Es gibt eine Super-POM-Datei, von der alles geerbt wird. • Diese steht auf: – http://maven.apache.org/guides/introduction/introduction-to-thepom.html – %M2_HOME%\lib\maven-model-builder3.2.3\org\apache\maven\model\pom-4.0.0.xml • Durch diesen Mechanismus wird viel an der Konfiguration gespart. Vererbt werden... Super-POM Vererbung • Abhängigkeiten • Plugins • Entwickler-Informationen POM Komponenten – WS 2014/15 – Teil 3/Maven 25 Convention over Configuration III • Es können zwischen Projekten beliebige Vererbungshierarchien aufgebaut werden, im einfachsten Fall wie hier 1-stufig. • Mit mvn help:effective-pom wird angezeigt, welche Werte nach Abarbeitung der Vererbung gelten. Komponenten – WS 2014/15 – Teil 3/Maven 26 Lebenszyklen I • Default – dient der eigentlichen Entwicklung validate, initialize, generate-sources, process-sources, generate-resources, process-resources, compile, process-classes, generate-test-sources, process-test-sources, generate-testresources, process-test-resources, test-compile, process-testclasses, test, prepare-package, package, preintegration-test, integration-test, post-integration-test, verify, install, deploy • Clean – dient zum Aufräumen der generierten Dateien pre-clean, clean, post-clean • Site – dient zur Generierung der Dokumentation pre-site, site, post-site, site-deploy Komponenten – WS 2014/15 – Teil 3/Maven 27 Lebenszyklen II – Default (Auszug) • • • • • • • validate – Prüfung auf gültige und vollständige Projektstruktur compile – Übersetzen test – Durchführen der Tests package – Erstellen der erzeugten Pakete verify – Prüfung der Pakete install – Installieren im lokalen Repository deploy - Installieren im globalen Repository Die einzelnen Phasen innerhalb des Zyklus haben eine bestimmte Reihenfolge, die immer bis zum angegebenen Ziel durchlaufen wird. Oben wurden die am meisten verwendeten Ziele aufgeführt. Komponenten – WS 2014/15 – Teil 3/Maven 28 Lebenszyklen III – Default (Auszug) test-compile install Wird als Parameter eine Phase angegeben, so wird immer bis einschließlich der angegebenen Phase der Lebenszyklus durchlaufen package compile test validate test package verify install Komponenten – WS 2014/15 – Teil 3/Maven deploy 29 mvn compile I Komponenten – WS 2014/15 – Teil 3/Maven 30 mvn compile II Nun ist ein weiterer Ordner angelegt: target Komponenten – WS 2014/15 – Teil 3/Maven 31 mvn package I Komponenten – WS 2014/15 – Teil 3/Maven 32 mvn package II Auf das Testen wird noch später eingegangen. Komponenten – WS 2014/15 – Teil 3/Maven 33 mvn package III Komponenten – WS 2014/15 – Teil 3/Maven 34 mvn package IV - Ausführen java -cp hello-1.0-SNAPSHOT.jar de.htw_berlin.f4.kbe.App pause Wenn die Manifest-Datei geändert wird, wird der Aufruf einfacher. So ist es am besten, ein bat-File zum Starten zu schreiben. Komponenten – WS 2014/15 – Teil 3/Maven 35 Aufrufe I mvn [options] [phase] | [plugin[:goal]] mvn -h Hilfe zu dem Kommando mvn help:help Hilfe zur Entwicklungsumgebung mvn help:effective-settings Anzeige der für den Lauf gesetzten Parameter mvn help:effective-pom Anzeige der für den Lauf gesetzten POM-Information mvn dependency:tree -Dverbose Abhängigkeitsbaum generieren mvn compile Nur Übersetzen mvn test Alles bis zum Test durchführen mvn package Jar-File generieren mvn install In lokales Repository kopieren mvn site Dokumentation generieren mvn clean Alles Generierte wegwerfen Komponenten – WS 2014/15 – Teil 3/Maven 36 Aufrufe II • Es können Phasen als Parameter angeben werden, z.B. compile. • Hinter einer Phase kann noch ein Ziel mit einem Doppelpunkt getrennt angegeben werden. Z.B. – mvn compile – Alles bis einschließlich Phase compile – mvn compiler:compile – genauso, aber compiler ist der Name eines Plugins und compile das Ziel für dieses Plugin. – mvn compiler:testCompile – Es wird nur die Testsoftware übersetzt Komponenten – WS 2014/15 – Teil 3/Maven 37 Jetzt erzeugen wir ein ausführbares jar-File I <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.4</version> <configuration> <archive> <manifest> <mainClass>de.htw_berlin.f4.kbe.App</mainClass> <addClasspath>true</addClasspath> </manifest> </archive> </configuration> </plugin> </plugins> Dies wird in das POM-File eingefügt. </build> Komponenten – WS 2014/15 – Teil 3/Maven 38 Erläuterungen • <build> bedeutet, dass der eingeschlossene Text sich auf die BuildPhase bezieht. • <plugins> leitet eine Liste der Plugins ein – hier für den Build-Prozess • <configuration> ist der Abschnitt mit Parametern für ein spezielles Plugin. Welche Parameter was bedeuten, muss der Plugin-Dokumentation entnommen werden. • Siehe: – http://mvnrepository.com/artifact/org.apache.maven.plugins/mavenjar-plugin – http://maven.apache.org/plugins/maven-jar-plugin/plugin-info.html • Zum jar-Problem: – http://openbook.galileocomputing.de/javainsel/javainsel_19_004.html – http://www.java-forum.org/java-basics-anfaenger-themen/132539jar-datei-ausfuehren.html – http://de.wikihow.com/Eine-.Jar-Java-Datei-ausführen Komponenten – WS 2014/15 – Teil 3/Maven 39 Jetzt erzeugen wir ein ausführbares jar-File II mvn clean mvn package Komponenten – WS 2014/15 – Teil 3/Maven 40 Jetzt erzeugen wir ein ausführbares jar-File III java -jar hello-1.0-SNAPSHOT.jar pause Komponenten – WS 2014/15 – Teil 3/Maven 41 Nun soll es sofort ausgeführt werden I <build> <plugins> ... <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>1.2.1</version> <configuration> <mainClass>de.htw_berlin.f4.kbe.App</mainClass> </configuration> </plugin> </plugins> </build> Dies wird in das POM-File eingefügt. Der Name der Startklasse muss entweder hier angegeben werden oder als Parameter für Maven. Komponenten – WS 2014/15 – Teil 3/Maven 42 Nun soll es sofort ausgeführt werden II mvn exec:java Dies bedeutet, dass das exec-Plugin in derselben Java-Maschine wie maven ausgeführt werden soll. Komponenten – WS 2014/15 – Teil 3/Maven 43 Nun soll es sofort ausgeführt werden III • Dokumentation zum Plugin: http://mojo.codehaus.org/exec-maven-plugin/ • Starten ohne Startklasse im POM: mvn exec:java –Dexec.mainClass=de.htw_berlin.f4.kbe.App • Es gibt zwei Quellen für Plugins: – Maven-Projekt http://maven.apache.org/plugins/index.html – Mojo-Codehaus: http://mojo.codehaus.org/plugins.html • Diesen Quellen sind die Koordinaten sowie die Parameter der Plugins zu entnehmen. Komponenten – WS 2014/15 – Teil 3/Maven 44 Die Sache mit den Tests package de.htw_berlin.f4.kbe; import junit.framework.*; public class AppTest extends TestCase { public AppTest( String testName ) { super( testName ); } public static Test suite() { return new TestSuite( AppTest.class ); } public void testApp() { assertTrue( true ); } } Dies ist ein nicht ganz ernst gemeinter Test mit JUnit 3.8.* Die Tests mit der Version 4 sehen etwas anders aus. Wenn diese benutzt werden muss im <dependency>-Teil die andere Version benutzt werden. Komponenten – WS 2014/15 – Teil 3/Maven 45 Nach dieser Anstrengung etwas Entspannung... Komponenten – WS 2014/15 – Teil 3/Maven 46