3. Die im Dokument verwendeten Tools
Die Beispiele in diesem Dokument wurden mit den folgenden Tools getestet:
- NetBeans von Version 6.8 bis Version 7.1.2. Die Installation von NetBeans wird in [ref3] in Abschnitt 1.3.1 beschrieben.
- Wampserver Version 2.2. Die Installation von WampServer wird in [ref3] in Abschnitt 1.3.3 beschrieben;
- Maven ist in NetBeans integriert. Wir beschreiben nun dieses Tool.
3.1. Maven
3.1.1. Einführung
Maven ist unter URL [http://maven.apache.org/index.html ] verfügbar. Laut seinen Entwicklern:
Das vorrangige Ziel von Maven ist es, einem Entwickler zu ermöglichen, den vollständigen Stand eines Entwicklungsprojekts in kürzester Zeit zu erfassen. Um dieses Ziel zu erreichen, gibt es mehrere Bereiche, mit denen sich Maven befasst:
- Vereinfachung des Build-Prozesses
- Bereitstellung eines einheitlichen Build-Systems
- Bereitstellung hochwertiger Projektinformationen
- Bereitstellung von Leitlinien für bewährte Entwicklungspraktiken
- Ermöglichung einer transparenten Migration zu neuen Funktionen
Maven ist in NetBeans integriert, und wir werden es für eine einzige seiner Funktionen nutzen: die Verwaltung der Bibliotheken eines Projekts. Diese bestehen aus der Gesamtheit der Archive jars, die sich im Verzeichnis Classpath des Projekts befinden müssen. Es kann sehr viele davon geben. Beispielsweise werden unsere zukünftigen Projekte den ORM (Objekt-Relational-Mapper) Hibernate verwenden. Dieser ORM setzt sich aus Dutzenden von jar-Archiven zusammen. Der Vorteil von Maven besteht darin, dass wir nicht alle Archive kennen müssen. Es reicht aus, in unserem Projekt anzugeben, dass wir Hibernate benötigen, und dabei alle relevanten Informationen bereitzustellen, um das Hauptarchiv dieses ORM zu finden. Maven lädt dann auch alle für Hibernate erforderlichen Bibliotheken herunter. Diese werden als Abhängigkeiten von Hibernate bezeichnet. Eine für Hibernate erforderliche Bibliothek kann ihrerseits wiederum von anderen Archiven abhängig sein. Diese werden ebenfalls heruntergeladen. Alle diese Bibliotheken werden in einem Ordner abgelegt, der als lokales Maven-Repository bezeichnet wird.
Ein Maven-Projekt lässt sich leicht weitergeben. Wenn man es von einem Rechner auf einen anderen überträgt und die Abhängigkeiten des Projekts im lokalen Repository des neuen Rechners nicht vorhanden sind, werden sie heruntergeladen.
Maven kann eigenständig oder integriert in eine IDE (Integrierte Entwicklungsumgebung) wie NetBeans oder Eclipse verwendet werden.
Erstellen wir ein Maven-Projekt in NetBeans:
![]() |
- In [1] ein neues Projekt erstellen,
- in [2] die Kategorie [Maven] und den Projekttyp [Java Application] auswählen,
![]() |
- in [3] den übergeordneten Ordner des neuen Projektordners festlegen,
- in [4], geben Sie dem Projekt einen Namen,
- in [5] das generierte Projekt.
Sehen wir uns die Elemente des Projekts an und erläutern wir die jeweilige Funktion.
![]() |
- in [1]: die verschiedenen Zweige des Projekts:
- [Source packages]: die Java-Klassen des Projekts;
- [Test packages]: die Testklassen des Projekts;
- [Dependencies]: die für das Projekt erforderlichen und von Maven verwalteten .jar-Archive;
- [Test Dependencies]: die für die Tests des Projekts erforderlichen und von Maven verwalteten .jar-Dateien;
- [Java Dependencies]: die für das Projekt erforderlichen .jar-Dateien, die nicht von Maven verwaltet werden;
- [Project Files]: Konfigurationsdateien für Maven und NetBeans,
![]() |
- in [3], der Zweig [Source Packages],
Dieser Zweig enthält den Quellcode der Java-Klassen des Projekts. NetBeans hat eine Standardklasse generiert:
package istia.st.mvexemple;
/**
* Hello world!
*
*/
public class App {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
![]() |
- in [4], den Zweig [Test Packages], der den Quellcode der Testklassen des Projekts enthält,
- in [5], die Bibliothek JUnit 3.8, die für die Ausführung der Tests erforderlich ist,
NetBeans hat eine Standardklasse generiert:
package istia.st.mvexemple;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
/**
* Unit test for simple App.
*/
public class AppTest extends TestCase {
/**
* Create the test case
*
* @param testName
* name of the test case
*/
public AppTest(String testName) {
super(testName);
}
/**
* @return the suite of tests being tested
*/
public static Test suite() {
return new TestSuite(AppTest.class);
}
/**
* Rigourous Test :-)
*/
public void testApp() {
assertTrue(true);
}
}
Dies ist ein Test der Version JUnit 3.8. Im weiteren Verlauf werden wir Tests der Version JUnit 4.x verwenden.
![]() |
- In [6] ist der Zweig [Dependencies] leer.
Dieser Zweig zeigt alle für das Projekt erforderlichen Bibliotheken an, die von Maven verwaltet werden. Alle hier aufgeführten Bibliotheken werden automatisch von Maven heruntergeladen. Aus diesem Grund benötigt ein Maven-Projekt einen Internetzugang. Die heruntergeladenen Bibliotheken werden lokal gespeichert. Wenn ein anderes Projekt eine Bibliothek benötigt, die bereits lokal vorhanden ist, wird diese nicht erneut heruntergeladen. Wir werden sehen, dass diese Liste der Bibliotheken sowie die Repositorys, in denen sie zu finden sind, in der Konfigurationsdatei des Maven-Projekts definiert sind.
![]() |
- in [7] die für das Projekt erforderlichen Bibliotheken, die nicht von Maven verwaltet werden,
![]() |
- in [7] die Konfigurationsdatei [pom.xml] des Maven-Projekts. POM steht für „Project Object Model“. Wir werden später direkt in diese Datei eingreifen müssen.
Die generierte Datei [pom.xml] sieht wie folgt aus:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>istia.st</groupId>
<artifactId>mv-exemple</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>mv-exemple</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
- Die Zeilen 5–8 definieren das Java-Objekt (Artefakt), das vom Maven-Projekt erstellt wird. Diese Informationen stammen aus dem Assistenten, der bei der Erstellung des Projekts verwendet wurde:
![]() |
Ein Maven-Objekt wird durch vier Eigenschaften definiert:
- [groupId]: Eine Angabe, die einem Paketnamen ähnelt. So haben die Bibliotheken des Spring-Frameworks groupId=org.springframework, die des Frameworks JSF haben groupId=javax.faces,
- [artifactId]: der Name des Maven-Objekts. In der Gruppe [org.springframework] finden sich somit die folgenden artifactId: spring-context, spring-core, spring-beans, ... In der Gruppe [javax.faces] findet man artifactId und jsf-api,
- [version]: Versionsnummer des Maven-Artefakts. Das Artefakt org.springframework.spring-core hat somit folgende Versionen: 2.5.4, 2.5.5, 2.5.6, 2.5.6.SECO1, ...
- [packaging]: Die Form des Artefakts, meist war oder jar.
Unser Maven-Projekt generiert ein [jar] (Zeile 8) in der Gruppe [istia.st] (Zeile 5) mit dem Namen [mv-exemple] (Zeile 6) und der Version [1.0-SNAPSHOT] (Zeile 7). Diese vier Angaben müssen ein Maven-Artefakt eindeutig definieren.
In den Zeilen 17–24 sind die Abhängigkeiten des Maven-Projekts aufgeführt, d. h. die Liste der für das Projekt erforderlichen Bibliotheken. Jede Bibliothek wird durch die vier Angaben (groupId, artifactId, Version, Packaging) definiert. Wenn die Angabe packaging wie hier fehlt, wird die JAR-Datei packaging verwendet. Hinzu kommt eine weitere Angabe, der „Scope“, der festlegt, zu welchen Zeitpunkten im Lebenszyklus des Projekts die Bibliothek benötigt wird. Der Standardwert ist „compile“, was bedeutet, dass die Bibliothek sowohl für die Kompilierung als auch für die Ausführung erforderlich ist. Der Wert „test“ bedeutet, dass die Bibliothek während der Tests des Projekts benötigt wird. Dies ist hier bei der Bibliothek JUnit 3.8.1 der Fall. Wenn diese Bibliothek nicht im lokalen Repository des Rechners vorhanden ist, wird sie heruntergeladen.
3.1.2. Ausführung des Projekts
Wir führen das Projekt aus:
![]() |
In [1] wird das Maven-Projekt erstellt und anschließend [1] ausgeführt. Die Protokolle in der NetBeans-Konsole lauten wie folgt:
Das Ergebnis ist Zeile 23. Man sieht, dass Maven selbst in diesem einfachen Fall Elemente heruntergeladen hat (Zeilen 17 und 20).
3.1.3. Das Dateisystem eines Maven-Projekts
![]() |
- [1]: Das Dateisystem des Projekts befindet sich auf der Registerkarte [Files],
- [2]: Die Java-Quelldateien befinden sich im Ordner [src / main / java],
- [3]: Die Java-Quelldateien für die Tests befinden sich im Ordner [src / test / java],
- [4]: Der Ordner [target] wird beim Erstellen (Build) des Projekts angelegt,
- [5]: Hier hat der Build-Vorgang des Projekts ein Archiv mit dem Namen [mv-exemple-1.0-SNAPSHOT.jar] erstellt.
3.1.4. Das lokale Maven-Repository
Wir haben bereits erwähnt, dass Maven die für das Projekt erforderlichen Abhängigkeiten herunterlädt und lokal speichert. Dieses lokale Repository kann wie folgt durchsucht werden:
![]() |
- In [1] wählen wir die Option [Window / Other / Maven Repository Browser],
- in [2] öffnet sich eine Registerkarte [Maven Repositories],
- bei [3] enthält er zwei Zweige, einen für das lokale Repository und einen für das zentrale Repository. Letzteres ist riesig. Um dessen Inhalt anzuzeigen, muss der Index [4] aktualisiert werden. Diese Aktualisierung dauert mehrere Dutzend Minuten.
![]() |
- in [5], die Bibliotheken des lokalen Repositories,
- in [6] findet man einen Zweig [istia.st], der dem [groupId] unseres Projekts entspricht,
- unter [7] greift man auf die Eigenschaften des lokalen Repositorys zu,
- unter [8] findet man den Pfad zum lokalen Repository. Es ist hilfreich, diesen zu kennen, da Maven manchmal (selten) nicht mehr die neueste Version des Projekts verwendet. Man nimmt Änderungen vor und stellt fest, dass diese nicht berücksichtigt werden. In diesem Fall kann man den Zweig des lokalen Repositorys, der unserem [groupId] entspricht, manuell löschen. Dadurch wird Maven gezwungen, den Zweig anhand der neuesten Version des Projekts neu zu erstellen.
3.1.5. Ein Artefakt mit Maven suchen
Lernen wir nun, wie man mit Maven nach einem Artefakt sucht. Beginnen wir mit der Liste der aktuellen Abhängigkeiten der Datei [pom.xml]:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>istia.st</groupId>
<artifactId>mv-exemple</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>mv-exemple</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
Die Zeilen 17–23 definieren Abhängigkeiten, die wir ändern werden, um die Bibliotheken in ihrer neuesten Version zu verwenden.
![]() |
Zunächst entfernen wir die aktuellen Abhängigkeiten [1]. Die Datei [pom.xml] wird daraufhin wie folgt geändert:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>istia.st</groupId>
<artifactId>mv-exemple</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>mv-exemple</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies></dependencies>
</project>
In Zeile 17 erscheint die entfernte Abhängigkeit nicht mehr in [pom.xml]. Suchen wir nun in den Maven-Repositorys danach.
![]() |
- In [1] wird dem Projekt eine Abhängigkeit hinzugefügt,
- in [2] müssen Angaben zum gesuchten Artefakt gemacht werden (groupId, artifactId, Version, Packaging (Typ) und Scope). Zunächst geben wir in [groupId] und [3]
- bei [4] geben wir [espace] ein, um die Liste der möglichen Artefakte anzuzeigen. Hier sind [junit] und [jnit-dep]. Wir wählen [junit],
- bei [5] wählen wir auf die gleiche Weise die aktuellste Version aus. Der Packaging-Typ ist jar,
- und [6]; wir wählen den Test-Scope, um anzugeben, dass die Abhängigkeit nur für Tests benötigt wird.
![]() |
In [6] erscheinen die hinzugefügten Abhängigkeiten im Projekt. Die Datei [pom.xml] spiegelt diese Änderungen wider:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>istia.st</groupId>
<artifactId>mv-exemple</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>mv-exemple</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
<type>jar</type>
</dependency>
</dependencies>
</project>
Es ist zu beachten, dass die Datei [pom.xml] die Abhängigkeit [hamcrest-core-1.1] nicht erwähnt, die wir in [6] sehen. Das liegt daran, dass es sich um eine Abhängigkeit von JUnit 4.10 handelt und nicht um eine Abhängigkeit des Projekts selbst. Dies wird durch ein anderes Symbol im Zweig [Dependencies] angezeigt. Die Datei wurde automatisch heruntergeladen.
Nehmen wir nun an, man kennt die [groupId] des gewünschten Artefakts nicht. Man möchte beispielsweise Hibernate als ORM (Objekt-Relational-Mapper) verwenden, und das ist alles, was man weiß. Dann kann man die Website [http://mvnrepository.com/] aufrufen:
![]() |
Unter [1] kann man Stichwörter eingeben. Geben wir hibernate ein und starten die Suche.
![]() |
- In [2] wählen wir [groupId], org.hibernate sowie [artifactId] und hibernate-core aus,
- aus [3] wählen wir die Version 4.1.2-Final,
- aus [4] erhalten wir den Maven-Code, den wir in die Datei [pom.xml] einfügen müssen. Das tun wir.
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>istia.st</groupId>
<artifactId>mv-exemple</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>mv-exemple</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
<type>jar</type>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.1.2.Final</version>
</dependency>
</dependencies>
</project>
Wir speichern die Datei „[pom.xml]“. Maven beginnt daraufhin mit dem Herunterladen der neuen Abhängigkeiten. Das Projekt entwickelt sich wie folgt:
![]() |
- zu [5], die Abhängigkeit [hibernate-core-4.1.2-Final]. In dem Repository, in dem sie gefunden wurde, wird diese [artifactId] ebenfalls durch eine Datei namens [pom.xml] beschrieben. Diese Datei wurde gelesen, und Maven hat festgestellt, dass die Datei [artifactId] Abhängigkeiten hat. Diese lädt es ebenfalls herunter. Dies wird für jede heruntergeladene Datei [artifactId] durchgeführt. Letztendlich finden sich in der Datei „[6]“ Abhängigkeiten, die wir nicht direkt angefordert hatten. Sie werden durch ein anderes Symbol gekennzeichnet als die der Hauptdatei „[artifactId]“.
In diesem Dokument nutzen wir Maven hauptsächlich wegen dieser Eigenschaft. So müssen wir nicht alle Abhängigkeiten einer Bibliothek kennen, die wir verwenden möchten. Wir überlassen es Maven, diese zu verwalten. Außerdem stellt die gemeinsame Nutzung einer [pom.xml]-Datei unter den Entwicklern sicher, dass jeder Entwickler tatsächlich dieselben Bibliotheken verwendet.
In den folgenden Beispielen beschränken wir uns darauf, die verwendete Datei [pom.xml] bereitzustellen. Der Leser muss sie lediglich verwenden, um die gleichen Bedingungen wie im Dokument vorzufinden. Außerdem werden Maven-Projekte von den wichtigsten Java-Umgebungen (Eclipse, NetBeans, IntelliJ, JDeveloper) unterstützt. Somit kann der Leser seine bevorzugte IDE-Umgebung nutzen, um die Beispiele zu testen.


















