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

13

Komponenten – WS 2014/15 – Teil 3/Maven

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) (05)

4.0.0

17

Komponenten – WS 2014/15 – Teil 3/Maven

Hallo world! in Maven VII – pom.xml (06) (07) (08) (09)

de.htw_berlin.f4.kbe.hallo hello 1.0-SNAPSHOT jar

(10) (11)

hello http://maven.apache.org

Koordinaten

(12) (13) UTF-8 (14) (15) (16) (17) junit (18) junit (19) 3.8.1 (20) test (21) (22) (23) 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: -. – version gibt die Version nach folgendem Schema an: ..-- 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)

junit junit 3.8.1 test

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 II

Nun ist ein weiterer Ordner angelegt: target

Komponenten – WS 2014/15 – Teil 3/Maven

31

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. 35

Komponenten – WS 2014/15 – Teil 3/Maven

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 org.apache.maven.plugins maven-jar-plugin 2.4 de.htw_berlin.f4.kbe.App true Dies wird in das POM-File eingefügt. Komponenten – WS 2014/15 – Teil 3/Maven

38

Erläuterungen • bedeutet, dass der eingeschlossene Text sich auf die BuildPhase bezieht. • leitet eine Liste der Plugins ein – hier für den Build-Prozess • 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 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 ... org.codehaus.mojo exec-maven-plugin 1.2.1 de.htw_berlin.f4.kbe.App 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 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 -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