Apache Maven - Basics (Permalink)

Einführung

Apache Maven ist laut Wikipedia ein Build-Management-Tool, welches insbesondere geeignet ist, Java-Projekte zu standardisiert zu erstellen und zu verwalten.

Installation

Um mit Maven arbeiten zu können, muss man unter Gnu Debian 6.0 mindestens diese beiden Pakete installieren:

  • maven2
  • openjdk-6-jdk

Erstes Projekt

Maven verwendet ein standardisiertes Layout für die Projektverzeichnisse.

\projekt                     - Wurzelverzeichnis des Projekts
    \pom.xml                 - Verwaltungdatei
    \src
    |   \main
    |       \java            - Anwendungscode in Java
    |   \test
    |       \java            - Testcode in Java
    \target                  - alle erzeugten Dateien landen hier

Das target-Verzeichnis legt Maven dabei bei Bedarf neu an.

Die Datei "pom.xml" beschreibt dabei notwendige Informationen über das Projekt.

<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>de.lusiardi.maven</groupId>
        <artifactId>basics1</artifactId>
        <packaging>jar</packaging>
        <version>0.1</version>
        <name>Einfuehrung in Maven</name>
        <url>http://wp.lusiardi.de/?p=197</url>
        <build>
                <plugins>
                        <plugin>
                                <groupId>
                                        org.apache.maven.plugins
                                </groupId>
                                <artifactId>
                                        maven-compiler-plugin
                                </artifactId>
                                <version>2.1</version>
                                <configuration>
                                        <source>
                                                1.5
                                        </source>
                                        <target>
                                                1.5
                                        </target>
                                        <encoding>UTF-8</encoding>
                                </configuration>
                        </plugin>
                </plugins>
       </build>
       <dependencies>
                <dependency>
                        <groupId>junit</groupId>
                        <artifactId>junit</artifactId>
                        <version>4.8.2</version>
                        <scope>test</scope>
                </dependency>
        </dependencies>
</project>

Im Einzelnen bedeuten die Einträge folgendes:

  • modelVersion: aktuell immer 4.0.0
  • groupId: id für die Gruppe, zu der das Artefakt (das Projekt) gehört
  • artifactId: id des Artefakts (des Projekts)
  • packaging: jar legt fest, dass das Projekt als jar-Datei zusammengepackt werden soll
  • version: die Version des Projekts, -SNAPSHOT sagt aus, dass das Projekt noch im Entwicklungszustand ist und regelmässige Änderungen erwartet werden
  • name: der ausführliche Name des Projekts
  • url: URL zur Projektseite
  • build: Maven erlaubt es durch Plugins den Build-Prozess zu erweitern oder zu erweitern, hier wird der Java-Compiler konfiguriert (Java 5 für Annotations).
  • dependencies: gibt die Abhängigkeiten des Projekts zu anderen Projekten an. Hier wird beispielsweise JUnit in Version 4.8.2 eingebunden. Auf das Einbinden von Abhängigkeiten wird später noch eingegangen.

Unser eigentlicher Source-Code besteht nur aus einer Datei in src/main/java/b1/Math.java (keine Kommentare zum Sinn des Codes bitte):

package b1;

public class Math {                                                  
        public static int square(int a) {                            
                return a*a;                                          
        }                                                            
}

Unsere Testdateien sind ähnlich hochwertig (zu finden in: src/test/java/b1/MathTest.java):

 package b1;

import org.junit.Assert;
import org.junit.Test;
import b1.Math;

public class MathTest {
        @Test
        public void testSqure() {
                Assert.assertEquals(16, Math.square(4));
        }
}

Wichtige Maven-Kommandos

mvn clean

clean löscht alle durch Maven erzeugten Dateien (inklusive des target-Verzeichnisses)

mvn compile

kompiliert den Quellcode unter src/main

mvn test

kompiliert die Test-Dateien und führt die Tests aus. Die Ergebnisse der Tests landen im Verzeichniss target/surefire-reports.

mvn package

erzeugt ein Paket im angegebenen Format (siehe pom.xml)

mvn install

erzeugt das Paket und installiert es im lokalen Repository. So kann es von anderen Projekten als Abhängigkeit verwendet werde.

Résumé

Natürlich kann man Maven nicht ausführlich auf einer solch kurzen Seite beschreiben und komplett erschöpfen, doch sollte dies ein kleiner Einstieg sein. Weitere Artikel zu Maven werden den Umgang mit Abhängigkeiten, ausführbaren Jar-Dateien und dem Einbinden von ANTLR in den Build-Prozess behandeln.

Update 5. Juni 2018

Die Quellen zu diesem Artikel findet man jetzt unter https://gitea.lusiardi.de/jlusiardi/MavenBasics1. Maven 3.3 kann in einem Docker-Container mit folgendem Kommando zum Build benutzt werden:

docker run -it --rm -v "$(pwd)":/usr/src/mymaven   
 -w /usr/src/mymaven maven:3.3-jdk-8 mvn clean install

Update 27. Mai 2023

Mit der Verwendung von Maven 3.6.3 ist als source und target Version mindestens 1.7 zu verwenden. Ebenso wurde junit auf Version 4.13.2 aktualisiert. Der angepasste Quellcode steht im alt bekannten Gitea bereit.