Apache Maven - Dependencies (Permalink)

Im zweiten Teil der Serie über Apache Maven (hier geht es zum ersten Teil) geht es diesmal um Repositories und Dependencies.

Dependencies

Als Beispiel einer Dependency war im ersten Teil bereits JUnit aufgefallen (Ausschnitt pom.xml):

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.8.2</version>
</dependency>

Das reicht aus, um Maven zu sagen: bitte binde doch mal JUnit in Version 4.8.2 in den ClassPath ein. Maven lädt die notwendigen JARs dabei automatisch aus dem Netz herunter. Dazu dienen eine Reihe von Standardrepositories.

Repositories

Nicht alle Dependencies sind in den Standardrepositories vorhanden. Ist für eine Bibliothek ein eigenes Repository notwendig, so kann das wie folgt in der pom.xml angegeben werden:

<repositories>
    <repository>
        <id>jline</id>
        <name>JLine Project Repository</name>
        <url>http://jline.sourceforge.net/m2repo</url>
    </repository>
</repositories>

Hat man die notwendigen Repositories aktiviert kann man weitere Abhängigkeiten festlegen:

<dependency>
    <groupId>jline</groupId>
    <artifactId>jline</artifactId>
    <version>0.9.9</version>
</dependency>

Beispielprogramm

Ergänzen wir das Projekt aus Teil 1 um die Datei src/main/java/b1/Main.java:

package b1;

import java.io.IOException;
import java.io.PrintWriter;

import jline.ConsoleReader;

public class Main {
    public static void main(String[] args) throws IOException{
        ConsoleReader reader = new ConsoleReader();
        String line;
        PrintWriter out = new PrintWriter(System.out);
        while ((line = reader.readLine("number or quit> ")) != null) {
            if (line.equalsIgnoreCase("quit"))
                break;
            int i = Integer.parseInt(line);
            System.out.println(
                Math.square(i)+" ist " + i + " quadriert");
            out.flush();
        }
    }
}

Übersetzen und in ein JAR-File einpacken mit

mvn package

Testweise ausführen kann man das Programm nun einfach mit:

mvn exec:java -Dexec.mainClass="b1.Main"

Résumé

Dieser Teil der Serie hat das Einbinden von Abhängigkeiten vorgestellt. Sucht man für eine Bibliothek die notwendigen Angaben helfen Seiten wie http://mvnrepository.com. So hilft einem Maven durch das automatische Herunterladen schnell zu einer Menge von mächtigen Bibliotheken.

Update 23. Juli 2013

Die Quellen zu diesem Artikel kann man nun auch bei GitHub herunterladen oder forken.

Update 5. Juni 2018

Die Quellen zu diesem Artikel findet man jetzt unter https://git.lusiardi.de/jlusiardi/MavenBasics2. 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 wurden junit auf Version 4.13.2 und jline auf 2.14.6 aktualisiert. Auf eine aktualisierung von jline auf Version 3.x wurde verzichtet, da hier der Quellcode stärker hätte angepasst werden müssen. Der angepasste Quellcode steht im alt bekannten Gitea bereit.

Praktische Ergänzung: mvn versions:display-dependency-updates listet alle Dependencies, von denen neue Version vorhanden sind übersichtlich auf. Somit können diese entsprechend aktualisiert werden. Es empfiehlt sich die Changelogs der entsprechenden Projekte zu studieren, um keine Überraschungen zu erleben.