Komponenten-basierte Entwicklung Teil 3: Einführung in...
Embed Size (px)
Transcript of Komponenten-basierte Entwicklung Teil 3: Einführung in...

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