Maven-Abhängigkeitsmechanismus
Der Maven-Abhängigkeitsmechanismus ist eine der Kernfunktionen des Apache Maven Build-Tools. Er kann die vom Projekt benötigten externen Bibliotheken (JAR-Dateien) und deren Abhängigkeiten automatisch herunterladen und verwalten.
Der Maven-Abhängigkeitsmechanismus vereinfacht den Build-Prozess von Java-Projekten erheblich und ermöglicht es Entwicklern, das manuelle Herunterladen und Verwalten verschiedener Bibliotheken von Drittanbietern zu vermeiden.
Maven speichert Millionen von Open-Source-Bibliotheken über das Maven Central Repository. Wenn Sie eine Abhängigkeit in Ihrem Projekt deklarieren, lädt Maven diese Bibliothek und alle ihre Abhängigkeiten automatisch aus dem Repository herunter.
Abhängigkeitsdeklaration
Deklarieren Sie es in pom.xml mit dem <dependency>-Tag:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
Grundlegende Konzepte der Maven-Abhängigkeiten
1. Koordinatensystem (Koordinaten)
Maven verwendet drei grundlegende Koordinaten, um eine Abhängigkeit eindeutig zu identifizieren:
- groupId: Definiert die Organisation oder das Unternehmen, zu dem das Projekt gehört (z. B.,
org.apache) - artifactId: Definiert den Namen des Projekts (z. B.,
commons-lang3) - version: Definiert die Version des Projekts (z. B.,
3.12.0)
Zusammen bilden diese drei Elemente die eindeutige Kennung einer Maven-Abhängigkeit.
2. Abhängigkeitsbereich
Maven definiert verschiedene Abhängigkeitsbereiche, die bestimmen, in welchen Phasen eine Abhängigkeit verfügbar ist:
- compile(Standard): Verfügbar beim Kompilieren, Testen und zur Laufzeit
- provided: Verfügbar beim Kompilieren und Testen, wird aber zur Laufzeit vom JDK oder Container bereitgestellt
- runtime: Nur zum Testen und zur Laufzeit benötigt
- test: Nur während der Testkompilierung und -ausführung benötigt
- system: Ähnlich wie provided, erfordert aber einen expliziten JAR-Pfad
3. Transitive Abhängigkeiten
Wenn Projekt A von Projekt B abhängt und Projekt B von Projekt C abhängt, bindet Maven Projekt C automatisch als Abhängigkeit von Projekt A ein. Diese automatische Behandlung von Abhängigkeiten wird als transitive Abhängigkeiten bezeichnet.
Die Transitivitätsregeln hängen vom Scope ab:
| Aktueller Abhängigkeits-Scope \ Transitiver Abhängigkeits-Scope | compile | provided | runtime | test |
|---|---|---|---|---|
| compile | compile | - | runtime | - |
| provided | provided | provided | provided | - |
| runtime | runtime | - | runtime | - |
| test | - | - | - | - |
So verwenden Sie Maven-Abhängigkeiten in Projekten
1. Abhängigkeiten in pom.xml hinzufügen
In der Maven-Projekt-pom.xmlDatei<dependencies>wird der Abschnitt zum Deklarieren von Projektabhängigkeiten verwendet:
Beispiel
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
</dependencies>
2. Ausschlüsse von Abhängigkeiten
Manchmal kann es nötig sein, eine transitive Abhängigkeit auszuschließen; Sie können<exclusions>Tag:
Beispiel
<groupId>com.example</groupId>
<artifactId>example-library</artifactId>
<version>1.0</version>
<exclusions>
<exclusion>
<groupId>org.unwanted</groupId>
<artifactId>unwanted-dependency</artifactId>
</exclusion>
</exclusions>
</dependency>
3. Abhängigkeitsverwaltung
In Multi-Modul-Projekten können Sie im übergeordneten POM verwenden<dependencyManagement>um Abhängigkeitsversionen einheitlich zu verwalten:
Beispiel
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.3.20</version>
</dependency>
</dependencies>
</dependencyManagement>
Wenn untergeordnete Module auf Abhängigkeiten verweisen, müssen sie nur groupId und artifactId deklarieren, ohne die Version anzugeben.
Erweiterte Funktionen der Abhängigkeitsverwaltung
Verwaltung von Abhängigkeitsversionen
Verwenden SiedependencyManagement, um Versionen einheitlich zu verwalten:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.3.18</version>
</dependency>
</dependencies>
</dependencyManagement>
<!-- 子模块使用时无需指定版本 -->
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</dependency>
</dependencies>
BOM-Import
Versionen einer Reihe zusammengehöriger Abhängigkeiten verwalten:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.6.4</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
Optionale Abhängigkeiten
Abhängigkeiten als optional und nicht transitiv markieren:
<dependency>
<groupId>com.example</groupId>
<artifactId>optional-lib</artifactId>
<version>1.0</version>
<optional>true</optional>
</dependency>
Mechanismus zur Auflösung von Maven-Abhängigkeiten
1. Abhängigkeitsmediation
Wenn Versionskonflikte auftreten, löst Maven sie nach den folgenden Regeln auf:
- Die nächstgelegene Definition gewinnt (die Version mit dem kürzesten Pfad im Abhängigkeitsbaum wird ausgewählt)
- Wenn die Pfadlänge gleich ist, hat die zuerst deklarierte Abhängigkeit Vorrang.
2. Auswirkung des Abhängigkeitsbereichs
Abhängigkeiten mit unterschiedlichen Scopes beeinflussen die Transitivität:
- Abhängigkeiten mit dem Scope compile sind transitiv
- Abhängigkeiten mit den Scopes provided und test sind nicht transitiv
- Abhängigkeiten mit dem Scope runtime sind transitiv mit dem Scope runtime
Endgültige Paketierungsergebnisse von Abhängigkeiten mit unterschiedlichen Scopes:
| Geltungsbereich | Ob verpackt | Typische Verwendung |
|---|---|---|
compile | Ja | Kernabhängigkeiten |
provided | nein | Vom Container bereitgestellt |
runtime | Ja | Zur Laufzeit benötigt |
test | nein | Unit-Tests |
3. Optionale Abhängigkeiten
Als optional markierte Abhängigkeiten sind nicht transitiv:
Beispiel
<groupId>com.example</groupId>
<artifactId>optional-lib</artifactId>
<version>1.0</version>
<optional>true</optional>
</dependency>
Abhängigkeitsbezogene Befehle
Abhängigkeitsbaum anzeigen:
mvn dependency:tree
Abhängigkeitsprobleme analysieren:
mvn dependency:analyze
Abhängigkeiten in Verzeichnis herunterladen:
mvn dependency:copy-dependencies
Maven-Repository
1. Repository-Typen
- Lokales Repository: Befindet sich im Home-Verzeichnis des Benutzers unter
.m2/repositoryVerzeichnis sichern - Zentrales Repository: Mavens standardmäßiges öffentliches Repository
- Remote-Repository: Ein privates Repository, das von einem Unternehmen oder einer Organisation erstellt wurde
2. Repository-Konfiguration
Sie können konfigurieren inpom.xmlodersettings.xmldas Repository konfigurieren:
Beispiel
<repository>
<id>my-repo</id>
<url>http://repo.example.com/maven2</url>
</repository>
</repositories>
Best Practices
- Abhängigkeitsversionen explizit angeben: Vermeiden Sie die Verwendung dynamischer Versionen wie LATEST oder RELEASE
- Abhängigkeiten regelmäßig aktualisieren: Verwenden Sie
mvn versions:display-dependency-updatesum verfügbare Updates zu überprüfen - BOM verwenden: Für große Frameworks (z. B. Spring) verwenden Sie eine Stückliste, um Versionen einheitlich zu verwalten
- Nicht verwendete Abhängigkeiten bereinigen: Führen Sie regelmäßig
mvn dependency:analyzeum nicht verwendete Abhängigkeiten zu überprüfen