Mar 032008
 

Die Features von Maven2 sind sehr überzeugend:

  • Convention over Configuration
  • Management der Abhängigkeiten zu Bibliotheken (inklusive transitiver Abhängigkeiten)
  • Integration von Unit-Tests in Build
  • usw.

Eclipse als IDE ist natürlich auch sehr überzeugend. Für mich heisst das konkret: Maven nur in Verbindung mit Eclipse. Toolintegration ist für mich sehr wichtig, um maximale Produktivität zu erzielen. Ein Handwerker wird schließlich auch nicht Schrauben mit der Hand festziehen…


Um Maven2 in Eclipse einzubinden, bietet sich das Maven2 Eclipse Plugin (M2Eclipse aka Tycho) an. Zuvor muss jedoch Maven2 selbst installiert werden. Das M2Eclipse-Plugin erlaubt das Erstellen von Maven-Projekten und übernimmt deren Build-Prozess.

Verwaltung von Abhängigkeiten

Das Hinzufügen von Abhängigkeiten zu Bibliotheken zu einem Maven-Eclipse-Projekt ist genial einfach:

Add Dependency with M2Eclipse

Durch das Hinzufügen einer Abhängigkeit zu einer Bibliothek wird die Projektmodell-Datei “pom.xml” um einen Dependency-Eintrag ergänzt. Im Eintrag ist die ID der Bibliothek und die genaue Versionsnummer festgehalten. Maven lädt das entsprechende JAR aus dem öffentlichen Maven-Repository im Netz herunter und legt diese im lokalen Maven-Repository ab. Auf diese Weise ist lokal, auch bei der Verwendung in mehreren Projekten, nur eine Kopie dieser JAR notwendig.

Daraus ergibt sich der Vorteil, dass die benötigten JAR-Dateien nicht mit in das Versionskontrollsystem comitted werden müssen. Lediglich die “pom.xml” wird eingecheckt. Diese Einfachheit kann unter Umständen auch gelegentlich zum Problem werden: Was ist zum Beispiel, wenn eine Bibliothek oder eine bestimmte Version einer Bibliothek benötigt wird, die nicht über öffentliche Maven-Repositories erhältlich ist?

Gibt es gar kein öffentliches Maven-Repository, welches die JAR-Datei bereit hält, so ist die Lösung das Installieren der JAR-Datei in das lokale Maven-Repository. Im Projektumfeld mit vielen Entwicklern, kann es sinnvoll sein, ein Projekt- oder Bereichs-Repository auf einem Abteilungsserver o.ä. aufzusetzen und dieses Repository in der “pom.xml” anzugeben. Gibt es ein spezielles Maven-Repository, welches die Bibliothek bereitstellt, so muss die “pom.xml” in dieser Art ergänzt werden:

<repositories>
<repository>
<id>codehaus</id>
<name>Codehaus Release Repo</name>
<url>http://dist.codehaus.org/</url>
</repository>
</repositories>

Dieses Beispiel führt zur Einbindung des Repositories von Codehaus. Dort findet sich beispielsweise die aktuellste Version 6.1.4 des Jetty HttpServers, welcher jedoch nicht in Standard-Repositories wie http://repo1.maven.org/maven2/ zu finden war (Stand 2.3.2008).

Projektreferenzen in Eclipse

Es ist nicht unüblich ein großes Projekt in mehrere Eclipse-Projekte aufzuteilen. Gründe hierfür sind die Forcierung des Architektur-Layerings (Trennung Business- und Presentation-Tier) oder unterschiedliche Einstellungen der Eclipse-Projekte (Compiler, etc.).

Maven sieht die Aufteilung eines großen Projektes in Teilprojekte bereits vor. Unterstützt wird dies durch Mavens Vererbungsmechanismus für das POM (Projektmodell). In der “pom.xml” ist die Angabe eines Basis-POM möglich, von dem zu erben ist. Per Konvention liegt das Parent-POM im lokalen Verzeichnis über dem Teilprojekt.

In Eclipse ist es jedoch vorteilhaft, die Parent-POM in einem gesonderten Projekt unterzubringen. Dann ist es möglich dieses Projekt in das Versionskontrollsystem einzuchecken. Damit dies möglich ist, muss die Angabe des Parent-POM ähnlich wie folgt sein:

<project>
<parent>
<artifactId>root</artifactId>
<groupId>opendarwin</groupId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../opendarwin-root</relativePath>
</parent>

Zu beachten ist die Angabe des relativen Pfades zum Verzeichnis des Parent-POM. Das Parent-POM enthält Informationen über alle Teilprojekte aka Module:

<?xml version=”1.0″ encoding=”UTF-8″?><project>
<modelVersion>4.0.0</modelVersion>
<groupId>opendarwin</groupId>
<artifactId>root</artifactId>
<version>0.0.1-SNAPSHOT</version>
<description></description>
<modules>
<module>../opendarwin-shared</module>
<module>../opendarwin-server</module>
<module>../opendarwin-client</module>
</modules>
<packaging>pom</packaging>
</project>

Dadurch ist es möglich, das ein Teilprojekt über eine reguläre POM-Dependency ein anderes Teilprojekt referenzieren kann. Das Teilprojekt “opendarwin-server” benötigt “opendarwin-shared”, also findet sich folgender Eintrag in der “pom.xml” von “opendarwin-server”:

<dependency>
<groupId>opendarwin</groupId>
<artifactId>shared</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>

Das M2Eclipse-Plugin macht aus dieser Angabe eine direkte Referenz auf das entsprechende Eclips-Projekt im Eclipse-Build-Path:

Eclipse-Projektreferenz mit M2Eclipse

Problem mit Ausgabe von Compile Fehlern / Aktualisieren des Compiler Plugins

Bei der Verwendung von M2Eclipse bin ich auf ein Problem gestossen: Beim Compile zeigte mir Maven die tatsächlichen Compile-Fehler nicht in der Konsole an. Normalerweise ist dies kein Problem, da die Syntax-Fehler auch in Eclipse als Problem-Markierungen durch den Eclipse-Compiler angezeigt werden. Offenbar hatte der Maven-Build also ein Problem beim Compile, welches der Eclipse-Compiler nicht hatte.

Beim Stöbern im Netz nach dem Problem, wurde ich beim Maven Compiler Plugin fündig. Es gibt bereits einen Patch (vom 29.1.2008), der bereits in den aktuellen Source-Stand des Maven Compiler Plugins integriert ist, jedoch noch in keinem Release enthalten ist (Stand 2.3.2008). Kein Problem: Quellen des Maven Compiler Plugin auschecken und per Maven das JAR in das lokale Repository installieren. Das Maven Compiler Plugin ist ein Plugin für Maven, nicht für Eclipse, welches von Maven über das Maven-Repository eingebunden wird. Daher kann es auf diese Weise lokal aktuaisiert werden.

Nach dem Patchen des Maven Compiler Plugins erfolgt die Ausgabe der Compile-Fehler wie erwartet: Offenbar kommt der Compiler nicht mit der Java 5 Syntax meines Quellcodes klar, da dieser Java 1.4 Syntax erwartet.

Java 5 Quell-Syntax konfigurieren

Durch folgendes Fragment in der POM kann Java 5 im Projekt verwendet und durch Maven kompiliert werden:

<build>
<defaultGoal>package</defaultGoal>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.5</source>
<target>1.5</target>

<showDeprecation>true</showDeprecation>
<showWarnings>true</showWarnings>
</configuration>
</plugin>
</plugins>
</build>

Fazit

Maven2 mit M2Eclipse rockt! Das Management der transitiven Abhängigkeiten (Bibliotheken, welche wiederum von den verwendeten Bibliotheken benötigt werden) ist sehr hilfreich und gestaltet die Build-Konfiguration sehr übersichtlich. Beim Einbinden von Bibliotheken ist das Zeit-Einsparpotential sehr hoch. Ich bin überzeugt.

  4 Responses to “Maven in Eclipse verwenden”

  1. Da die Bibliotheken direkt von der Herrstellerseite heruntergeladen werden ist Maven leider nur wirklich effektiv in einer Umgebung zu verwenden die direkten Zugang zum Internet hat. Bei großen Firmen, die einen direkten Zugang bzw. das generelle Herunterladen von Dateien aus dem Internet verbieten, gestaltet sich die Verwendung daher schwierig. Man müsste in diesem Fall ein lokales im internen Netz liegendes Repository pflegen, welches wie auch immer aktuell gehalten werden müsste.
    Da stellt sich dann wieder die Frage nach Aufwand und Nutzen. Aber generell ist es natürlich sehr bequem wenn Abhängigkeiten zu anderen Bibliothekten automatisch aufgelöst werden.

  2. Für Maven gibt es auch die Möglichkeit einen HTTP-Proxy zu konfigurieren. In Unternehmen, welche IT Entwicklung im großen Stil betrieben, sollte ein eigenes Maven-Repository aufgesetzt werden. Vielversprechend sieht in diesem Zusammenhang auch das Open Source Projekt Archiva aus, welches auf die Verwaltung eines solchen UNternehmensrepositories ausgerichtet ist: http://maven.apache.org/archiva/

  3. Anstatt archiva kann man auch Artifactory verwenden. Ich setze es ein und bin sehr zufrieden damit, da es den Build-Prozess u.a. beschleunigt.
    Siehe hierzu auch http://blog.ralfmuehle.de/kategorien/einrichten-eines-maven-repositories

  4. […] Maven in Eclipse verwenden von Marc Neumann […]

 Leave a Reply

(required)

(required)

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>