Download - Komponenten-basierte Entwicklung Teil 3: Einführung in Mavenwi.f4.htw-berlin.de/.../AI-KBE-WS14/Folien/KBE-03/03-KBE-Maven-1.pdf · Komponenten – WS 2014/15 – Teil 3/Maven 3

Transcript

Komponenten – WS 2014/15 – Teil 3/Maven 20.10.14 1

Komponenten-basierte Entwicklung

Teil 3: Einführung in Maven

Komponenten – WS 2014/15 – Teil 3/Maven 2

Literatur und Web

[3-1] Maven by Examplehttp://www.sonatype.com/resources/books/maven-by-example/download

Oder die Vorversion: http://www.filibeto.org/~aduritz/truetrue/mvn/maven-by-example-0.7.pdf

[3-2] Maven – the complete Referencehttp://www.sonatype.com/resources/books/maven-the-complete-reference/download

[3-3] Better Builds with Mavenhttp://www.i-proving.ca/download/Technologies/Maven/Maven+Resources/BetterBuildsWithMaven-1.0.2.pdf

[3-4] Maven 3.0http://www.torsten-horn.de/techdocs/maven.htm

[3-5] Behrendt, Mario: Jenkins. Kurz&Gut, O'Reilly, 20111

Komponenten – WS 2014/15 – Teil 3/Maven 3

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 4

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-SchnittstelleEs 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 5

Maven – Funktionen II

• Beachtung und Verwaltung der Abhängigkeiten(Dependency Management)

• Globales Repository für

– PluginsDiese werden auch Mojos genanntMojo = 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 6

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 7

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-Eingabe-Fenster 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 8

Installation III - Windows

• Prüfung von PATH:

• Letzter Test mit „mvn -v":

Komponenten – WS 2014/15 – Teil 3/Maven 9

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 10

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, Scala-Projekte 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 11

Hallo world! in Maven I

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

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

Komponenten – WS 2014/15 – Teil 3/Maven 12

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 13

Hallo world! in Maven II

Eingabe 1

Eingabe 2

Eingabe 3

Komponenten – WS 2014/15 – Teil 3/Maven 14

Hallo world! in Maven III

Und nun der Schluss

Komponenten – WS 2014/15 – Teil 3/Maven 15

Hallo world! in Maven IV

Initial aufgebauteOrdnerstruktur

Komponenten – WS 2014/15 – Teil 3/Maven 16

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 17

Hallo world! in Maven VI

Ordnerinhalt von hello

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

Inhalt von pom.xml – Erster Teil

Komponenten – WS 2014/15 – Teil 3/Maven 18

Hallo world! in Maven VII – pom.xml

(06) <groupId>de.htw_berlin.f4.kbe.hallo</groupId>(07) <artifactId>hello</artifactId>(08) <version>1.0-SNAPSHOT</version>(09) <packaging>jar</packaging>

(10) <name>hello</name>(11) <url>http://maven.apache.org</url>

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

Koordinaten

Abhängigkeiten

Komponenten – WS 2014/15 – Teil 3/Maven 19

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 20

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

– artifactIdIdentifier als Name des Artifakts, meist eines Programms. Der Dateiname wird meist nach folgendem Schema aufgebaut:<artifactId>-<version>.<packaging>

– versiongibt die Version nach folgendem Schema an: <Major>.<Minor>.<Bugfix>-<Qualifier>-<Buildnumber>Für unfertige Versionen ist der Qualifier SNAPSHOT

– PackagingTyp des Pakets, z.B. jar, ear, war oder pom

Komponenten – WS 2014/15 – Teil 3/Maven 21

Erläuterungen III - Abhängigkeiten

(16) <dependency>(17) <groupId>junit</groupId>(18) <artifactId>junit</artifactId>(19) <version>3.8.1</version>(20) <scope>test</scope>(21) </dependency>

Wenn eine Abhängigkeit definiert ist und das entsprechende Zielerreicht werden soll, werden alle fehlende Bibliotheken, POM-Dateienetc. 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 22

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 23

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 24

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 25

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-the-

pom.html

– %M2_HOME%\lib\maven-model-builder-3.2.3\org\apache\maven\model\pom-4.0.0.xml

• Durch diesen Mechanismus wird viel an der Konfiguration gespart.

Super-POM

POM

Vererbung

• Abhängigkeiten

• Plugins

• Entwickler-Informationen

Vererbt werden...

Komponenten – WS 2014/15 – Teil 3/Maven 26

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 27

Lebenszyklen I

• Default – dient der eigentlichen Entwicklungvalidate, initialize, generate-sources, process-sources, generate-resources, process-resources, compile, process-classes, generate-test-sources, process-test-sources, generate-test-resources, process-test-resources, test-compile, process-test-classes, test, prepare-package, package, preintegration-test, integration-test, post-integration-test, verify, install, deploy

• Clean – dient zum Aufräumen der generierten Dateienpre-clean, clean, post-clean

• Site – dient zur Generierung der Dokumentationpre-site, site, post-site, site-deploy

Komponenten – WS 2014/15 – Teil 3/Maven 28

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 bestimmteReihenfolge, die immer bis zum angegebenen Ziel durchlaufenwird. Oben wurden die am meisten verwendeten Ziele aufgeführt.

Komponenten – WS 2014/15 – Teil 3/Maven 29

Lebenszyklen III – Default (Auszug)

validate

compile

test-compile

install

deploy

verify

package

test

test

pack

age

ins t

al l

Wird als Parametereine Phase angegeben,so wird immer bis einschließlichder angegebenen Phaseder Lebenszyklus durchlaufen

Komponenten – WS 2014/15 – Teil 3/Maven 30

mvn compile I

Komponenten – WS 2014/15 – Teil 3/Maven 31

mvn compile II

Nun ist ein weitererOrdner angelegt: target

Komponenten – WS 2014/15 – Teil 3/Maven 32

mvn package I

Komponenten – WS 2014/15 – Teil 3/Maven 33

mvn package II

Auf das Testen wird noch später eingegangen.

Komponenten – WS 2014/15 – Teil 3/Maven 34

mvn package III

Komponenten – WS 2014/15 – Teil 3/Maven 35

mvn package IV - Ausführen

java -cp hello-1.0-SNAPSHOT.jar de.htw_berlin.f4.kbe.Apppause

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 36

Aufrufe I

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

mvn [options] [phase] | [plugin[:goal]]

Komponenten – WS 2014/15 – Teil 3/Maven 37

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 38

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> </build>

Dies wird in das POM-File eingefügt.

Komponenten – WS 2014/15 – Teil 3/Maven 39

Erläuterungen

• <build> bedeutet, dass der eingeschlossene Text sich auf die Build-Phase 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/maven-jar-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/132539-jar-datei-ausfuehren.html

– http://de.wikihow.com/Eine-.Jar-Java-Datei-ausführen

Komponenten – WS 2014/15 – Teil 3/Maven 40

Jetzt erzeugen wir ein ausführbares jar-File II

mvn clean

mvn package

Komponenten – WS 2014/15 – Teil 3/Maven 41

Jetzt erzeugen wir ein ausführbares jar-File III

java -jar hello-1.0-SNAPSHOT.jarpause

Komponenten – WS 2014/15 – Teil 3/Maven 42

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 werdenoder als Parameter für Maven.

Komponenten – WS 2014/15 – Teil 3/Maven 43

Nun soll es sofort ausgeführt werden II

mvn exec:java

Dies bedeutet, dass das exec-Plugin in derselben Java-Maschine wie mavenausgeführt werden soll.

Komponenten – WS 2014/15 – Teil 3/Maven 44

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 45

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 andereVersion benutzt werden.

Komponenten – WS 2014/15 – Teil 3/Maven 46

Nach dieser Anstrengung etwas Entspannung...