Maven Tutorial für Anfänger

veröffentlicht am 16. Februar 2011

Maven ist meiner Meinung nach DAS Tool, um die Wiederverwendung von Java-Bausteinen zu fördern und die Entwicklung zu vereinfachen. Es steht dabei in Konkurrenz zu Ant, hat aber weitaus mehr zu bieten, als das einfache Build-Tool. Vor allem die einfache Einbindung von eigenen oder fremden Bibliotheken möchte man nach kurzer Zeit nicht mehr missen. Deshalb habe ich dieses kurze Tutorial geschrieben, um den Einsatz von Maven unter Eclipse zu demonstieren.

Als Grundvoraussetzung für das Tutorial müssen Eclipse, sowie das Eclipse-Plugin m2e installiert sein.

Maven Projekt anlegen

Zunächst einmal legst du ein Maven-Projekt über New » Project an:

Wähle im folgenden Fenster Maven » Maven Project aus und klicke auf Next:

Im nächsten Schritt aktivierst du das Häckchen bei Create a simple projekt (skip archetype selection). Archetypes sind Vorlagen für Maven Projekte, die bereits bestimmte Abhängigkeiten einbinden und Einstellungen setzen. Für dieses Projekt reicht eine einfache Projektstruktur jedoch vollkommen aus. Klicke dann auf Next:

Im nächsten Fenster musst du Angaben über das Projekt machen.

Die Group Id steht für den Hersteller und gibt in der Regel den Domainnamen des Herstellers in umgedrehter Reihenfolge an (ähnlich wie bei der Angabe von Package-Namen).

Die Artifact Id ist die Bezeichnung des Projekts. Wir erstellen eine simple Klasse, die überprüft, ob ein String ein Palindrom ist.

Darunter folgt die Versionsangabe. Die Versionsbenennung sollte nach diesem Schema erfolgen. Eine Besonderheit kommt dem Qualifizierer SNAPSHOT am Ende zu. Maven wird hierdurch klar gemacht, dass es sich um eine Entwicklungsversion handelt, die immer wieder überschrieben werden darf. Ich belasse es für dieses Tutorial erst einmal bei der Standardvorgabe.

Bei Packaging gibst du den Typ des zu erstellenden Programms ein. So bietet sich jar z.B. für Desktop-Applikationen oder gepackte Bibliotheken an, wohingegen war-Dateien typischerweise für Webprojekte genutzt werden.

Unter Name und Beschreibung kannst du dein Projekt noch einmal beschreiben.

Es kann ebenfalls ein Parent Project angegeben werden. Hierbei werden die Projekt-Einstellungen mit denen des neuen Projektes zusammengeführt. Das bietet sich zum Beispiel dann an, wenn mehrere Projekte eine fast identische Konfiguration besitzen. So ein Parent Project muss nicht zwangsläufig mit Inhalt befüllt werden, sondern kann auch einfach als Hilfskonstrukt für übliche Konfigurationen genutzt werden.

Nach einem beherzten Klick auf Finish ist das Projekt eingerichtet.

Abhängigkeit hinzufügen

Für dieses Projekt binden wir das bekannte Testframework TestNG ein. Klicke dazu auf die Datei pom.xml, die sich im Hauptordner deines Projekts befindet. Es öffnet sich der grafische POM-Editor von m2eclipse. Wähle unten den Reiter Dependendies. Klicke dann oben auf Add:

In der Suchmaske gibst du nun TestNG ein, wählst das passende Paket aus und klickst auf OK:

In der Übersicht siehst du nun, dass TestNG als Abhängigkeit hinzugefügt worden ist:

Maven kümmert sich nun automatisch darum, die gewünschten Bibliotheken inklusive ihrer Abhängigkeiten herunterzuladen und einzubinden. Ist besser, als alles manuell aus dem Internet holen und einbinden zu müssen, oder? ;)

Klassen schreiben

Für dieses Projekt schreiben wir zwei einfache Klassen. Die erste kann überprüfen, ob ein Wort ein Palindrome ist. Die zweite Klasse überprüft mit TestNG, ob die erste Klasse auch so funktioniert, wie sie soll.

Erstelle zunächst die Datei Palindrome.java im Ordner src/main/java und kopiere folgenden Inhalt hinein:

public class Palindrome {

	public static boolean isPalindrome(String input) {
		String a = input.toLowerCase();
		String b = new StringBuilder(a).reverse().toString();
		return a.equals(b);
	}

}

Erstelle dann die Datei PalindromeTest.java im Ordner src/test/java und nehme folgenden Inhalt:

import org.testng.Assert;
import org.testng.annotations.Test;

public class PalindromeTest {

	@Test
	public void isPalindromeTest() {
		Assert.assertTrue(Palindrome.isPalindrome("Otto"), "Ist kein Palindrome");
	}

	@Test
	public void isNoPalindromeTest() {
		Assert.assertFalse(Palindrome.isPalindrome("Test"), "Ist ein Palindrome");
	}

}

Projekt komplieren

Jetzt ist das Projekt bereit zum Kompilieren. Klicke dazu mit der rechten Maustaste auf dein Projekt und wähle Run As » Maven install:

Es öffnet sich das Konsolenfenster (falls noch nicht eingeblendet) und Maven führt nun eine ganze Reihe an Aktionen durch. Beim ersten Einsatz von Maven werden viele von Maven benötigte Pakete heruntergeladen. Ebenfalls werden bisher noch nicht genutzte Plugins und Bibliotheken heruntergeladen. Am Ende der Ausgabe sollten dann die Testresultate und der Build-Status stehen:

Wie man hier sieht, wurden beide Testfälle erfolgreich durchgeführt und der Build wurde erfolgreich abgeschlossen. Die resultierende jar-Datei findest du im Ordner target.

Fazit

Innerhalb kürzester Zeit versteht man die grundlegenden Funktionen von Maven und kann dieses als mächtiges Tool für die Java-Entwicklung einsetzen. Es empfiehlt sich zudem die Installation und Einrichtung eines so genannten Maven-Repositories, in das du deine Builds einpflegst. So kannst du in folgenden Projekten sehr bequem auf bereits bestehende Komponenten zurückgreifen, ohne diese wieder mühsam zusammensuchen und einbinden zu müssen. Für die Entwicklung im Team ist Maven meiner Meinung nach schon Pflicht ;)

Kommentare

Ich kann zwar etwas PHP, aber ich muss gestehen, das ich bei den Code-Zeilen nur Bahnhof verstehe *haha*

Aber trotzdem ne coole, ausführliche Beschreibung.

Kommentar #1 von Sebastian am 16. Februar 2011


@Sebastian: Ich sehe da keinen PHP Code. Das ist Java ;)

Kommentar #2 von David am 17. Februar 2011


Hehe, ja Eben, deshalb mein ich ja: Ich kann etwas PHP, aber Java versteh ich nur Bahnhof ;)

Kommentar #3 von Sebastian am 17. Februar 2011


Pingback #4 von » JSHint im Build-Prozess The Codejet am 24. September 2011


Findet die testng libs nicht ???

Kommentar #5 von marco am 21. November 2011


@marco: das war ja nur ein simples Beispiel zum Maven Einstieg. Interessant wird es erst, wenn man umfangreiche Projekte mit vielen (vor allem transitiven) Abhängigkeiten angeht.

Kommentar #6 von Patrick am 21. November 2011


Das Beispiel sollte schon funktionieren und es funktioniert nicht. Ich bin neu bei maven, falls möglich bitte ein funktionierendes Bsp einfügen bitte.

Kommentar #7 von marco am 21. November 2011


Achsoo, ich habe deine Aussage falsch verstanden. Ich dachte du wolltest mir damit sagen, dass man das auch ohne Maven hätte lösen können ;)

Wenn m2eclipse noch kein TestNG findet, dann ist der Index vom Maven Central Repository (dieses ist standardmäßig einkonfiguriert, weitere Repositories muss man selber eintragen) noch nicht vollständig heruntergeladen. Das kann je nach Uhrzeit auch mal 10 Minuten dauern (einmalig, danach hast du den Index im Cache).

Kommentar #8 von Patrick am 21. November 2011


Nochmal @ marco: wenn der Index noch lädt, wird unten „Downloading Indexes“ oder so ähnlich angezeigt. Den Fortschritt kannst du dir auch mit der Progress View anzeigen lassen. Aktiviere ggf. noch die Maven Repositories View, dort kannst du falls der Index nicht heruntergeladen wird per Kontextmenü den Index aktivieren und neu herunterladen lassen.

Kommentar #9 von Patrick am 21. November 2011


okay werde ich dann mal test, erstmal danke für die mühe. :)

Kommentar #10 von marco am 22. November 2011


Ahoi!

Ich musste in der Klasse PalindromeTest.java noch einen Import hinzufügen:
„import org.testng.Assert;“

Und in der Methode isNoPalindromeTest() muss ich „Assert.assertFalse“ verwenden, damit der Test positiv ist.

Kommentar #11 von noname am 23. November 2011


Schande über mein Haupt. Das kommt, wenn man das Ganze aus dem Kopf schreibt. Hab die Fehler oben im Text gefixt. :)

Kommentar #12 von Patrick am 23. November 2011


So hab das mal heute wiedrholt das tutorial und habs hinbekommen. manchmal ist man derart festgefahren das garnichts mehr läuft, dann muss man ein bisschen abstand gewinnen und es wiederholen. Dann funktioniert es meistens. ;)

Kommentar #13 von Marco am 29. November 2011


Ich möchte einfach nur dankeschön sagen. Hat mir sehr geholfen.

Kommentar #14 von Robert am 17. Februar 2012


Ich kann die Java Klassen überhaupt nicht erzeugen: „Source folder is not a Java project.“
Und die zweite Frage: kann man maven zu einem existierendem Web-Projekt zufügen? Bzw. – kann man ein Java-Web-Projekt von einem Maven-Projekt erzeugen?

Kommentar #15 von Iorg am 24. Februar 2012


Sorry, aber ich habe keine Ahnung, wie du diese Fehlermeldung hinbekommen hast :D Was hast du denn genau gemacht, um diese Fehlermeldung zu erzeugen?

Kommentar #16 von Patrick am 24. Februar 2012


Damit die Frage möglichst präzise zu beantworten, habe ich alles wiederholt. Jetzt geht. Vielen Dank für die schnelle Antwort. Könntest du bitte auch die Frage über Web-Projekt irgendwie kommentieren?

Kommentar #17 von Iorg am 24. Februar 2012



Ich habe noch was gefunden: http://www.mkyong.com/maven/how-to-convert-java-web-project-to-maven-project/

Kommentar #19 von Iorg am 25. Februar 2012


Hallo Patrick,

danke für diesen Beitrag. Ich muss mich im Rahmen eines Vorstellungsgespräches mit Maven beschäftigen, da ich ein solches Projekt dann refactoren soll. Ich wusst bis ebend nicht so richtig wie ich anfangen soll, aber jetzt hab ich ne Idee :). Ich werde mal den Rest deines Blogs noch durchforsten in der Hoffnung, dass ich noch mehr zu Maven finde. Du hast es sehr gut verständlich geschrieben, danke.

Kommentar #20 von Daniel Butze am 01. Juni 2012


Hallo zusammen, ich versuche das Beispiel bei mir zu testen, aber ich bekommen folgende Fehlermeldung: Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.7.1:test (default-test) on project TestMaven: There are test failures.

Hat jemand eine Idee?

Kommentar #21 von silas am 01. Oktober 2012


Hallo silas,

hast du TestNG richtig eingebunden? Ansonsten mal auf nopaste.info die komplette Maven Ausgabe und die pom.xml kopieren – dann kann ich dir besser weiterhelfen.

Gruß
Patrick

Kommentar #22 von Patrick am 02. Oktober 2012


Hallo Patrick,

danke für deine schnelle Antwort, das Problem ist gelöst, ich hatte testNG nicht richtig eingebunden.

Gruß,

Silas

Kommentar #23 von silas am 02. Oktober 2012


Hallo,

coole Beschreibung, klappt aber bei mir nicht. Beim Erstellen eines neues Projektes kommen Errors vom mavenplugin.
Could not calculate build plan: Plugin org.apache.maven.plugins:maven-resources-plugin:2.5 or one of its dependencies could not be resolved: Failed to read artifact descriptor for org.apache.maven.plugins:maven-resources-plugin:jar:2.5
Plugin org.apache.maven.plugins:maven-resources-plugin:2.5 or one of its dependencies could not be resolved: Failed to read artifact descriptor for org.apache.maven.plugins:maven-resources-plugin:jar:2.5

Habe jetzt schon mehrere Eclipse-Versionen (alle neu installiert, dann über den Marketplace die Mavenunterstützung geladen) ausprobiert, immer kommen irgendwelche Fehler.

Gruß
Klaus

Kommentar #24 von Klaus am 10. Januar 2013


Hallo Klaus,

installiere m2eclipse bitte über folgende Update Site: http://download.eclipse.org/technology/m2e/releases
Diese Vorgehensweise habe ich schon etliche Male in der Praxis angewandt, das Problem muss also irgendwo bei dir liegen.

Eventuell ist auch beim Herunterladen des maven-resources-plugins ein Fehler aufgetreten. Lösche vorsichtshalber auch einmal deinen lokalen Maven Cache (standardmäßig unter \.m2\repository).

Gruß
Patrick

Kommentar #25 von Patrick am 10. Januar 2013


Wie benutzt man maven in swing awt Desktop Anwendungen mit eigener Event dispatcher und mvc Implementierung?

Kommentar #26 von Daniel Seelig am 10. Juni 2013


Maven hat nichts mit Swing und AWT, geschweige denn mit einer speziellen Softwarearchitektur zu tun. Falls du Inspiration für eine wartbare Architektur für Desktop Anwendungen brauchst, solltest du meinen Artikel JavaFX MVP Anwendung mit Spring und Guava’s EventBus lesen (dort wird auch Maven verwendet),

Kommentar #27 von Patrick am 10. Juni 2013


Hi,
habe Maven in Eclipse installiert.. wenn ich jetzt ein Projekt erstellen will, und im letzten Schritt auf „Finish“ drücke, kommt die Fehlermeldung: „Could not calculate build plan: Plugin org.apache.maven.plugins:maven-resources-plugin:2.5 or one of its dependencies could not be resolved: Failed to read artifact description for org.apache.maven.plugins:maven-resources-plugin:jar:2.5 „..ich glaube diesen Fehler bekommen andere unerfahrene Benutzer auch.. weist du was zu tun ist?

Kommentar #28 von Christian am 20. August 2013


Hallo Christian,

solche Probleme hatte ich noch nie und liegt wahrscheinlich auch nicht am Kenntnisstand. Ich vermute, dass Maven das angegebene Plugin nicht aus dem Internet laden kann. Das Plugin befindet sich zumindest auf dem standardmäßig verwendeten Maven Central Server. Jetzt kann es eventuell sein, dass irgendeine Firewall oder ein Proxy den Download verhindert. Ein anderes (Netzwerk-)Problem kann ich aber auch nicht ausschließen.

Hier hat jemand denselben Fehler wie du: http://vikashazrati.wordpress.com/2010/06/26/could-not-calculate-build-plan-missing-maven-resources-pluginmaven-plugin2-4-1/

Eventuell hilft es, wenn du dein lokales Repository löschst (ich nehme an, da liegt noch nichts wichtiges drin, wenn du gerade erst mit Maven anfängst). Dieses findest du in deinem Benutzerverzeichnis unter .m2\repository

Ich hoffe, das hilft dir weiter.

Gruß
Patrick

Kommentar #29 von Patrick am 20. August 2013


Sehr gute Einführung, danke Patrick!

Kommentar #30 von Michael am 12. September 2013


Hi,
es ist ende 2013 und ich hoffe nicht hier nicht irgendwelche Leichen geweckt zu haben. Aber dein Bsp. ist sehr simpel und taucht in diversen Suchanfragen wieder auf.

Daher hätte ich noch eine Bitte:
Könntest du für die Grafische Bearbeitungsansicht der POM in eclipse einige Beispiele machen?
– z.B wie ich den Parameter true dort einfach rein schreiben kann, den ich dank langsamer INet-Leitung sehr häufig brauche.

– Ebenso bekomme ich es bei bestehenden Projekten nicht hin das „marven install“ -U auszuführen, um Probleme mit dem vorhandenen repro zu vermeiden. Ich gehe auf Run As –>Marven install und dann rattert er auch schon los. Wenn ich auf run configuration gehe, bin ich aufgeschmissen, da ich nicht weiß, welche Parameter ich dort eintippen muss. (Finde auch die „configuration“ nicht wieder, welche er per default nimmt, wenn ich „Run As –>Marven install“ verwende.

– Ach ja, muss das „Run As –>Marven …“ eigentlich immer mit einem Rechtsklick auf die POM erfolgen, oder reicht hier ein Klick auf das ganze Projekt und er sucht automatisch nach der richtigen POM?

Grüße Oekel

Kommentar #31 von David am 25. Oktober 2013


Hallo Oekel,

zu allererst, weil du es jedes mal falsch geschrieben hast: es heißt Maven (ohne r) ;)

Was meinst du mit dem „true“ Parameter?

Wozu musst du immer mit dem Schalter -U starten? Dependencies aus dem Internet ändern sich nicht so häufig und „deine eigenen“ Dependencies sollten automatisch immer aktuell sein.

Welche Konfiguration meinst du? Es gibt nur eine Konfiguration, oder meinst du welches Profil?

Ausführen kann man einen Maven Build auch per Rechtsklick auf das Projekt, zumindest wenn die pom.xml im Hauptordner des Projekts liegt.

Wenn du manuell noch weitere Aufrufparameter beim Maven Build übergeben willst, muss du Run As -> Maven build… verwenden

Gruß
Patrick

Kommentar #32 von Patrick am 25. Oktober 2013


Sehr gut anhand des Beispiels erklärt.
Ich habe vorher lediglich mit ANT zu tun gehabt, was ja eine ganz andere Welt darstellt!
Irgendwann wird dann doch Maven interessant :-)

Kommentar #33 von Günter am 30. Oktober 2013


Hi,

mitlerweile habe ich es verstanden, doch in einem Punkt tue ich mich noch sehr schwer bzw. weiß es eigentlich garnicht.
Wie bekomme / finde ich die passende Maven Abhängingkeit für die POM, wenn ich zuvor eine jar direkt in den JavaBuildPath –>Lybraries beladen habe.

Also sprich, ich möchte meine Bastellei als reines Maven-Projekt anderen zur Verfügung stellen. (Konkretes Beispiel: jcoord.jar)
Google zeicht mir zwar andere POMs aus dem Netz an, wo eine entsprechende Dependency zu dem Projekt vorhanden zu sein scheint, doch wenn ich diese „stumpf“ in meine POM kopiere, speichere und neu baue, dann hat es mir nun schon 1x „irgendetwas“ zerhauen, so dass KEINE (jars) Lybraries aus dem JavaBuildPath mehr erkannt wurden. (Workarround „name“ in der POM kurz ändern und bauen, dann wieder zurück)

Etwas kürzer gefasst: es muss doch irgendwo eine Suche in m2e geben, die es mir erlaubt ??? (aus ???.jar) zu finden und gleich als Dependency zu übernehmen.

Grüße Oekel

Kommentar #34 von Oekel am 30. Oktober 2013


OMG, sorry für die Rechtschreibkunst. (Hab schon die zweite Nacht durch gemacht :(

Kommentar #35 von Oekel am 30. Oktober 2013


Abhängigkeiten sollten bestenfalls immer über Maven Repositories eingebunden werden. Wenn die gewünschte Abhängigkeit im Maven Central liegt, kanns sie einfach eingebunden werden. Sollte die Abhängigkeit jedoch auf einem anderen Server liegen, musst das entsprechende Repository auch in der pom.xml angeben werden (und evtl. müssen Zugangsdaten in der persönlichen settings.xml hinterlegt werden).

Kommentar #36 von Patrick am 30. Oktober 2013


leider zeigt sich bei mir in der Liste kein testng :-(

Es ist aber installiert und als Datei/Folder im Explorer sichtbar!

What should I do??

Kommentar #37 von Joachim am 28. August 2014


PS: Es wird auch kein Index geladen – er sucht zwar kurz, aber ist nach ner Sekunde fertig und findet…. nichts!

Kommentar #38 von Joachim am 28. August 2014


Kurz und knackig. So wünscht man sich einen ersten Einblick in die Funktionsweise. Ich hatte anfangs noch ein wenig gerätselt, woher Maven weiß, welche Testklassen es beim build auszuführen hat, aber das funktioniert wohl über die Annotations in der Testklasse. Ich gehe davon aus, dass man als Testframework genauso einfach JUnit verwenden kann.

Kommentar #39 von Daniel Richter am 13. Januar 2015


Jepp, Junit klappt genauso.
Das Tutorial ist ja schon etwas älter, damals war TestNG „state-of-the-art“ ;)

Kommentar #40 von Patrick am 13. Januar 2015


Hallo,

ich bin neu bei dem Thema TestNG/Maven/m2e/Eclipse/Java, habe etwas „Wissen“ zusammengegooglet und habe somit auch diese Website gefunden.
Noch habe ich nicht alles verstanden und möchte eine kleines Zusammenfassung dessen geben, „was“ ich bereits verstanden habe und was nicht. Ich bitte um Feedback was OK/NOK ist.

A) Statements:
1) Über das Java-Plugin m2e (kommt das von den Maven-Autoren ?) kann man ein Maven-Projekt erzeugen.
2) m2e ist ein Fronend/GUI zu Erzeugung/Verwaltung/Konfiguration von Maven-Projekten unter Eclipse.
3) Maven benötigt sein pom.xml File.
3a) pom.xml enthält Maven’s Abhängigkeiten, so z.B. zu TestNG.
4) Ist die enstprechende, in pom.xml beschriebene, SW nicht bereits da, wird sie heruntergeladen, so z.B. TestNG.
5) Annotations sind ein Bestandteil der Sprache Java.
6) Java kennt vordefinierte Annotations, läßt aber andere Annotations zu, die mit „@“ zu beginnen haben.

B) Fragen:
1) Wer kompiliert jetzt den Java-source-code und führt ihn aus ? JDK, Maven oder TestNG ?
2) Der Java-Code enthält Annotations, aber wer liest sie wann aus, um den Ablauf des Java-Scripts zu steuern ?
Maven oder TestNG ?
3) Wen steuert Eclipse ?
4) Wie arbeitet Maven mit TestNG zusammen, d.h. wer ruft wen für was auf ?

Mir ist der Zusammenhang noch nicht klar …

Vielen Dank
Rainer

Kommentar #41 von Rainer Haseneder am 01. September 2015


Es ist sher informative.
Danke schön!

Péter Bognár aus Ungarn.

Kommentar #42 von Péter Bognár am 06. April 2016


Hinterlasse einen Kommentar