14 Dependency Management

14.1 Einführung

Dependency Management ist ein zentrales Merkmal von Apache Maven. Es ermöglicht die Verwaltung und Auflösung von Projektabhängigkeiten und vereinfacht den Build-Prozess. Außerdem trägt es zur Konsistenz zwischen verschiedenen Projekten bei.

14.2 Grundlegende Konzepte

14.2.1 Was sind Abhängigkeiten?

Abhängigkeiten in Maven sind externe Bibliotheken oder Module, die ein Projekt zum Kompilieren und Ausführen benötigt. Sie werden in der pom.xml definiert und automatisch aus Remote-Repositories geladen.

14.2.2 Dependency Tags

Der grundlegende Tag zur Definition einer Abhängigkeit ist <dependency>, der innerhalb des <dependencies> Blocks in der pom.xml steht:

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>5.3.16</version>
    </dependency>
</dependencies>

14.3 Dependency Scopes

Maven nutzt Scopes, um festzulegen, in welchen Phasen eine Abhängigkeit bereitsteht. Es gibt sechs Haupt-Scopes.

14.3.1 Compile

<dependency>
    <groupId>commons-lang</groupId>
    <artifactId>commons-lang</artifactId>
    <version>2.6</version>
    <scope>compile</scope>
</dependency>

14.3.2 Provided

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
    <scope>provided</scope>
</dependency>

14.3.3 Runtime

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.28</version>
    <scope>runtime</scope>
</dependency>

14.3.4 Test

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.13.2</version>
    <scope>test</scope>
</dependency>

14.3.5 System

<dependency>
    <groupId>com.example</groupId>
    <artifactId>custom-lib</artifactId>
    <version>1.0.0</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/lib/custom-lib-1.0.0.jar</systemPath>
</dependency>

14.3.6 Import

<dependency>
    <groupId>com.example</groupId>
    <artifactId>example-bom</artifactId>
    <version>1.0.0</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>

14.4 Transitive Abhängigkeiten

Maven löst Abhängigkeiten rekursiv auf. Wenn Projekt A von B abhängt und B wiederum von C, wird C auch als Abhängigkeit von A betrachtet.

14.4.1 Abhängigkeiten in einem Baum darstellen

Zur Visualisierung kann der folgende Befehl verwendet werden:

mvn dependency:tree

14.5 Dependency Management

14.5.1 Verwendung von Dependency Management

Über den Abschnitt <dependencyManagement> können Versionen und Scopes von Abhängigkeiten für Unterprojekte festgelegt werden. Diese Abhängigkeiten werden dann in den Unterprojekten ohne Version angegeben.

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>5.3.16</version>
        </dependency>
    </dependencies>
</dependencyManagement>

Im Unterprojekt:

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
    </dependency>
</dependencies>

14.5.2 Vorteile von Dependency Management

14.6 Abhängigkeiten ausschließen

Um bestimmte transitive Abhängigkeiten auszuschließen, kann der <exclusions> Tag eingesetzt werden:

<dependency>
    <groupId>com.example</groupId>
    <artifactId>example-app</artifactId>
    <version>1.0.0</version>
    <exclusions>
        <exclusion>
            <groupId>org.unwanted</groupId>
            <artifactId>unwanted-lib</artifactId>
        </exclusion>
    </exclusions>
</dependency>

Ein tiefes Verständnis des Dependency Managements in Maven ermöglicht es, die Komplexität großer Projekte zu beherrschen. Scopes, transitive Abhängigkeiten und ein zentral verwaltetes System machen es einfacher, alle Bibliotheken konsistent und wartbar zu halten.