Komponenten-basierte Entwicklung Teil 3: Einführung in Maven

Werbung
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
Herunterladen