Maven-Abhängigkeitsbereiche

1. Einleitung

Maven ist eines der beliebtesten Build-Tools im Java-Ökosystem. Eine seiner Hauptfunktionen ist das Abhängigkeitsmanagement.

In diesem Artikel werden wir den Mechanismus beschreiben und untersuchen, der beim Verwalten transitiver Abhängigkeiten in Maven-Projekten hilft - Abhängigkeitsbereiche.

2. Transitive Abhängigkeit

Einfach ausgedrückt gibt es in Maven zwei Arten von Abhängigkeiten, direkt und transitiv.

Direkte Abhängigkeiten sind diejenigen, die explizit im Projekt enthalten sind. Diese können mit in das Projekt aufgenommen werden Stichworte:

 junit junit 4.12 

Transitive Abhängigkeiten sind dagegen Abhängigkeiten, die von unseren direkten Abhängigkeiten benötigt werden. Erforderliche transitive Abhängigkeiten werden von Maven automatisch in unser Projekt aufgenommen.

Wir können alle Abhängigkeiten einschließlich der transitiven Abhängigkeiten im Projekt mit dem Befehl : mvn dependency: tree auflisten.

3. Abhängigkeitsbereiche

Abhängigkeitsbereiche können dazu beitragen, die Transitivität der Abhängigkeiten zu begrenzen, und sie ändern den Klassenpfad für verschiedene erstellte Aufgaben. Maven verfügt über 6 Standardabhängigkeitsbereiche .

Und es ist wichtig zu verstehen, dass jeder Bereich - mit Ausnahme des Imports - Auswirkungen auf transitive Abhängigkeiten hat.

3.1. Kompilieren

Dies ist der Standardbereich, wenn kein anderer Bereich bereitgestellt wird.

Abhängigkeiten mit diesem Bereich sind in allen Build-Aufgaben im Klassenpfad des Projekts verfügbar und werden an die abhängigen Projekte weitergegeben.

Noch wichtiger ist, dass diese Abhängigkeiten auch transitiv sind:

 commons-lang commons-lang 2.6 

3.2. Unter der Voraussetzung

Dieser Bereich wird verwendet, um Abhängigkeiten zu markieren , die zur Laufzeit von JDK oder einem Container bereitgestellt werden sollen , daher der Name.

Ein guter Anwendungsfall für diesen Bereich wäre eine Webanwendung, die in einem Container bereitgestellt wird, in dem der Container bereits einige Bibliotheken selbst bereitstellt.

Zum Beispiel kann ein Web - Server, der bereits die Servlet API zur Laufzeit mit dem kann und somit in unserem Projekt, diese Abhängigkeiten definiert werden , stellt bereitgestellt Umfang:

 javax.servlet servlet-api 2.5 provided 

Die bereitgestellten Abhängigkeiten sind nur zur Kompilierungszeit und im Testklassenpfad des Projekts verfügbar. Darüber hinaus sind sie nicht transitiv.

3.3. Laufzeit

Die Abhängigkeiten mit diesem Bereich sind zur Laufzeit erforderlich , werden jedoch nicht für die Kompilierung des Projektcodes benötigt. Aus diesem Grund sind Abhängigkeiten, die mit dem Laufzeitbereich markiert sind, im Laufzeit- und Testklassenpfad vorhanden, fehlen jedoch im Kompilierungsklassenpfad.

Ein gutes Beispiel für Abhängigkeiten, die den Laufzeitbereich verwenden sollten, ist ein JDBC-Treiber:

 mysql mysql-connector-java 6.0.6 runtime 

3.4. Prüfung

Dieser Bereich wird verwendet, um anzugeben, dass die Abhängigkeit zur Standardlaufzeit der Anwendung nicht erforderlich ist, sondern nur zu Testzwecken verwendet wird. Testabhängigkeiten sind nicht transitiv und nur für Test- und Ausführungsklassenpfade vorhanden.

Der Standardanwendungsfall für diesen Bereich ist das Hinzufügen einer Testbibliothek wie JUnit zu unserer Anwendung:

 junit junit 4.12 test 

3.5. System

Der Systemumfang ist dem bereitgestellten Umfang sehr ähnlich . Der Hauptunterschied zwischen diesen beiden Bereichen besteht darin , dass wir vom System direkt auf ein bestimmtes Glas im System verweisen müssen.

Es ist wichtig, sich daran zu erinnern, dass das Erstellen des Projekts mit Systembereichsabhängigkeiten auf verschiedenen Computern fehlschlagen kann, wenn Abhängigkeiten nicht vorhanden sind oder sich an einem anderen Ort befinden als dem, auf den systemPath verweist:

 com.baeldung custom-dependency 1.3.2 system ${project.basedir}/libs/custom-dependency-1.3.2.jar 

3.6. Importieren

Dieser Bereich wurde in Maven 2.0.9 hinzugefügt und ist nur für den Abhängigkeitstyp pom verfügbar . Wir werden in zukünftigen Artikeln mehr über die Art der Abhängigkeit sprechen.

Import gibt an, dass diese Abhängigkeit durch alle effektiven Abhängigkeiten ersetzt werden soll, die im POM deklariert sind:

 com.baeldung custom-project 1.3.2 pom import 

4. Umfang und Transitivität

Jeder Abhängigkeitsbereich wirkt sich auf seine Weise auf transitive Abhängigkeiten aus. Dies bedeutet, dass unterschiedliche transitive Abhängigkeiten mit unterschiedlichen Bereichen im Projekt enden können.

Abhängigkeiten mit bereitgestellten Bereichen und Tests werden jedoch niemals in das Hauptprojekt aufgenommen.

Dann:

  • Für den Kompilierungsbereich werden alle Abhängigkeiten mit dem Laufzeitbereich mit dem Laufzeitbereich im Projekt und alle Abhängigkeiten mit dem Kompilierungsbereich mit dem Kompilierungsbereich im Projekt abgerufen
  • Für den bereitgestellten Bereich werden im Projekt sowohl Laufzeit- als auch Kompilierungsbereichsabhängigkeiten mit dem bereitgestellten Bereich abgerufen
  • Für den Testumfang, beide Laufzeit und die Kompilierung Umfang transitive Abhängigkeiten werden in der gezogen werden Test Umfang, in dem Projekt
  • Für die Laufzeit Umfang, beide Laufzeit und die Kompilierung Umfang transitive Abhängigkeiten werden in der gezogen werden Runtime - Umfang, in dem Projekt

5. Schlussfolgerung

In diesem kurzen Tutorial haben wir uns auf die Maven-Abhängigkeitsbereiche, ihren Zweck und die Details ihrer Funktionsweise konzentriert.

Wenn Sie tiefer in Maven eintauchen möchten, ist die Dokumentation ein guter Ausgangspunkt.