Abhängigkeitsverwaltung mit Maven

Eine der Kernfunktionen von Maven ist die Abhängigkeitsverwaltung. Wenn wir mit Multi-Modul-Projekten arbeiten (die Hunderte oder Tausende von Modulen oder Unterprojekten enthalten), werden die Abhängigkeitsbeziehungen zwischen den Modulen sehr komplex, und die Verwaltung wird sehr schwierig. In dieser Situation bietet Maven einen hochgradig kontrollierten Ansatz.


Entdeckung transitiver Abhängigkeiten

Eine ziemlich häufige Situation: Zum Beispiel hängt A von einer anderen Bibliothek B ab. Wenn ein anderes Projekt C A verwenden möchte, dann muss Projekt C auch die Bibliothek B verwenden.

Maven kann es vermeiden, nach allen erforderlichen Bibliotheken suchen zu müssen. Maven liest die Projektdateien (pom.xml), um die Abhängigkeitsbeziehungen zwischen Projekten zu finden.

Alles, was wir tun müssen, ist, die direkten Abhängigkeiten in der pom jedes Projekts zu definieren. Maven erledigt alles andere für uns.

Bei transitiven Abhängigkeiten kann der Graph aller enthaltenen Bibliotheken schnell wachsen. Wenn Bibliotheken doppelt vorhanden sind, werden die möglichen Situationen weiter zunehmen. Maven bietet einige Funktionen, um das Ausmaß transitiver Abhängigkeiten zu steuern.

Merkmal Funktionsbeschreibung
Abhängigkeitsmediation Legt fest, welche Abhängigkeitsversion verwendet wird, wenn mehrere manuell erstellte Versionen gleichzeitig auftreten. Wenn sich zwei Abhängigkeitsversionen auf derselben Ebene im Abhängigkeitsbaum befinden, wird die zuerst deklarierte Abhängigkeit verwendet.
Abhängigkeitsverwaltung Sie können direkt eine manuell erstellte Version angeben, die verwendet werden soll. Angenommen, Projekt C enthält Projekt B als Abhängigkeit und Projekt B hängt von Projekt A ab. In diesem Fall können Sie explizit die Version von Projekt A angeben, die verwendet werden soll, wenn auf Projekt B verwiesen wird. Das bedeutet, Sie können steuern, welche bestimmte Version von Projekt A von Projekt B verwendet wird.
Abhängigkeitsbereich Abhängigkeiten, die in jeder Phase des Build-Prozesses enthalten sind.
Abhängigkeitsausschluss Jede transitive Abhängigkeit kann über das Element "exclusion" ausgeschlossen werden. Zum Beispiel: A hängt von B ab, B hängt von C ab, also kann A C als "excluded" markieren.
Optionale Abhängigkeit Jede transitive Abhängigkeit kann mithilfe des Elements "optional" als optional gekennzeichnet werden. Zum Beispiel: A hängt von B ab und B hängt von C ab. Daher kann B C als optional kennzeichnen, sodass A C nicht mehr verwendet.

Abhängigkeitsbereich

Die Ermittlung transitiver Abhängigkeiten kann mithilfe der folgenden Abhängigkeitsbereiche eingeschränkt werden:

Geltungsbereich Beschreibung
Compile Dieser Bereich gibt an, dass die zugehörige Abhängigkeit nur im Classpath des Projekts gültig ist. Standardwert.
Provided Dieser Scope gibt an, dass die zugehörige Abhängigkeit von der Laufzeit-JDK oder einem Webserver bereitgestellt wird.
Laufzeit Dieser Scope gibt an, dass die zugehörige Abhängigkeit während der Kompilierungsphase nicht erforderlich ist, aber während der Ausführungsphase erforderlich ist.
Test Dieser Scope gibt an, dass die zugehörige Abhängigkeit nur für die Testkompilierungs- und -ausführungsphasen gedacht ist.
System Dieser Scope gibt an, dass Sie einen Systempfad angeben müssen.
Importieren Dieser Scope wird nur verwendet, wenn die Abhängigkeit in einem pom definiert ist. Gleichzeitig können dieim <dependencyManagement>-Abschnitt definierten Abhängigkeiten der POM-Datei des aktuellen Projekts ein bestimmtes POM ersetzen.

Abhängigkeitsverwaltung

Normalerweise gibt es unter einem gemeinsamen Projekt eine Reihe von Projekten. In diesem Fall können wir eine gemeinsame Abhängigkeits-pom-Datei erstellen, die alle gemeinsamen Abhängigkeiten enthält, die wir als Parent-POM der anderen Subprojekt-POMs bezeichnen. Das folgende Beispiel kann Ihnen helfen, dieses Konzept besser zu verstehen.

Das Folgende ist eine detaillierte Erklärung des obigen Abhängigkeitsgraphen:

  • App-UI-WAR hängt von App-Core-lib und App-Data-lib ab.

  • Root ist das übergeordnete Projekt von App-Core-lib und App-Data-lib.

  • Root definiert Lib1, lib2 und Lib3 als Abhängigkeiten in seinem dependencies-Abschnitt.

Der Code der Datei pom.xml von App-UI-WAR lautet wie folgt:

<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>com.companyname.groupname</groupId> <artifactId>App-UI-WAR</artifactId> <version>1.0</version> <packaging>war</packaging> <dependencies> <dependency> <groupId>com.companyname.groupname</groupId> <artifactId>App-Core-lib</artifactId> <version>1.0</version> </dependency> </dependencies> <dependencies> <dependency> <groupId>com.companyname.groupname</groupId> <artifactId>App-Data-lib</artifactId> <version>1.0</version> </Abhängigkeit> </Abhängigkeiten> </Projekt>

Der Code der Datei pom.xml von App-Core-lib lautet wie folgt:

<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"> <parent> <artifactId>Root</artifactId> <groupId>com.companyname.groupname</groupId> <version>1.0</version> </parent> <modelVersion>4.0.0</modelVersion> <groupId>com.companyname.groupname</groupId> <artifactId>App-Core-lib</artifactId> <version>1.0</version> <packaging>jar</packaging> </project>

Der Code der pom.xml-Datei von App-Data-lib lautet wie folgt:

<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"> <parent> <artifactId>Root</artifactId> <groupId>com.companyname.groupname</groupId> <version>1.0</version> </parent> <modelVersion>4.0.0</modelVersion> <groupId>com.companyname.groupname</groupId> <artifactId>App-Data-lib</artifactId> <version>1.0</version> <packaging>jar</packaging> </project>

Der Code der pom.xml-Datei von Root lautet wie folgt:

<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>com.companyname.groupname</groupId> <artifactId>Root</artifactId> <version>1.0</version> <packaging>pom</packaging> <dependencies> <dependency> <groupId>com.companyname.groupname1</groupId> <artifactId>Lib1</artifactId> <version>1.0</version> </dependency> </dependencies> <dependencies> <dependency> <groupId>com.companyname.groupname2</groupId> <artifactId>Lib2</artifactId> <version>2.1</version> </dependency> </dependencies> <dependencies> <dependency> <groupId>com.companyname.groupname3</groupId> <artifactId>Lib3</artifactId> <version>1.1</version> </dependency> </dependencies> </project>

Wenn wir nun das Projekt App-UI-WAR bauen, findet Maven alle Abhängigkeiten, indem es den Abhängigkeitsgraphen durchläuft, und baut die Anwendung.

Anhand des obigen Beispiels können wir die folgenden Schlüsselkonzepte kennenlernen:

  • Gemeinsame Abhängigkeiten können mithilfe des Parent-Pom-Konzepts zusammengefasst werden. Die Abhängigkeiten der Projekte App-Data-lib und App-Core-lib sind im Root-Projekt aufgeführt (siehe Packaging-Typ von Root, es ist ein POM).
  • Es ist nicht erforderlich, Lib1, lib2, Lib3 in App-UI-W als Abhängigkeiten zu deklarieren. Maven realisiert dieses Detail über den transitiven Abhängigkeitsmechanismus.
Andere Erweiterungen