Maven-Abhängigkeitsbereiche

Maven-Abhängigkeitsbereiche

1. Einführung

Maven ist eines der beliebtesten Build-Tools im Java-Ökosystem, und eines der Hauptmerkmale ist das Abhängigkeitsmanagement.

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

2. Transitive Abhängigkeit

Einfach ausgedrückt gibt es zwei Arten von Abhängigkeiten in Mavendirect undtransitive.

Direkte Abhängigkeiten sind diejenigen, die explizit in das Projekt einbezogen werden. Diese können mit den Tags von<dependency>in das Projekt aufgenommen werden:


    junit
    junit
    4.12

Transitive dependencies, on the other hand, are dependencies required by our direct dependencies. 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 Befehlmvn dependency:treeauflisten.

3. Abhängigkeitsbereiche

Abhängigkeitsbereiche können dabei helfen, die Transitivität der Abhängigkeiten zu begrenzen, und sie ändern den Klassenpfad für verschiedene erstellte Tasks. Maven has 6 default dependency scopes.

Es ist wichtig zu verstehen, dass jeder Bereich - mit Ausnahme vonimport - 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, umdependencies that should be provided at runtime by JDK or a container zu markieren, 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.

Beispiel: Ein Webserver, der die Servlet-API bereits zur Laufzeit bereitstellt. In unserem Projekt können diese Abhängigkeiten daher mit dem Gültigkeitsbereich vonprovideddefiniert werden:


    javax.servlet
    servlet-api
    2.5
    provided

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

3.3. Laufzeit

The dependencies with this scope are required at runtime, werden jedoch für die Kompilierung des Projektcodes nicht benötigt. Aus diesem Grund sind Abhängigkeiten, die mit dem Gültigkeitsbereichruntimemarkiert sind, in der Laufzeit und im 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. Test

Dieser Bereich wird verwendet, um anzuzeigen, dass die Abhängigkeit zur Standardlaufzeit der Anwendung nicht erforderlich ist, sondern nur zu Testzwecken verwendet wird. Test dependencies aren’t transitive and are only present for test and execution classpaths.

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

System scope is much similar to the provided scope. Der Hauptunterschied zwischen diesen beiden Bereichen besteht darin, dasssystem erfordert, dass wir direkt auf ein bestimmtes Glas im System verweisen.

Es ist wichtig, sich daran zu erinnern, dass das Erstellen des Projekts mit den Bereichsabhängigkeiten vonsystemauf verschiedenen Computern fehlschlagen kann, wenn Abhängigkeiten nicht vorhanden sind oder sich an einem anderen Ort befinden als der Punkt, auf densystemPathverweist:


    com.example
    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 undit’s only available for the dependency type pom. hinzugefügt. 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.example
    custom-project
    1.3.2
    pom
    import

4. Umfang und Transitivität

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

Abhängigkeiten mit den Bereichenprovided undtest werden jedoch niemals in das Hauptprojekt aufgenommen.

Dann:

  • Für den Bereich voncompilewerden alle Abhängigkeiten mitruntime scope mit dem Bereich vonruntimeim Projekt eingezogen, und alle Abhängigkeiten mit dem Bereich voncompilewerden mit dem Bereich eingezogen compile Umfang im Projekt

  • Für den Bereich vonprovidedwerden im Projekt sowohl die Bereichsabhängigkeiten vonruntimeals auch voncompilemit dem Bereich vonprovidedin das Projekt einbezogen

  • Für den Bereich vontestwerden im Projekt sowohl die transitiven Abhängigkeiten vonruntimeals auchcompilemit dem Bereich vontestin den Projektbereich einbezogen

  • Für den Bereich vonruntimewerden im Projekt sowohl die transitiven Abhängigkeiten vonruntimeals auchcompilemit dem Bereich vonruntimein den Projektbereich einbezogen

5. Fazit

In diesem kurzen Tutorial haben wir uns auf die Abhängigkeiten von Maven, ihren Zweck und die Einzelheiten ihrer Funktionsweise konzentriert.

Wenn Sie tiefer in Maven eintauchen möchten, istdocumentation ein guter Ausgangspunkt.