2013-06-03 7 views
26

Ich habe die Dokumentation gelesen und habe etwas Verständnis.Was ist der Unterschied zwischen diesen Maven Abhängigkeitsbereichen: zur Verfügung gestellt/kompilieren/system/import

Bitte korrigieren oder informieren Sie mich über die Wahrheit; wie pro mein Verständnis:

  • provided
    Die Abhängigkeiten müssen auf der Maschine sein, Sie den Code ausführen auf, und muss auf dem Weg

  • compile
    Die Abhängigkeiten auf der Maschine sein wird, nicht mitgerechnet dass führt den Code, so sind sie in der Build

  • system
    Genau das gleiche wie zur Verfügung gestellt, aber Sie müssen die Abhängigkeiten in einer jAR-Datei sein streng

  • import
    Scheint, wie es die Abhängigkeiten von einer anderen POM-Datei importieren soll, aber ich weiß nicht, wie/warum, so ein wenig Ausarbeitung würde

+3

http://maven.apache.org/guides/einleitung/einleitung-zu-abhängigkeit-mechanik.html –

+0

Das ist wo ich lese, aber irgendwie habe ich gefühlt, dass ich das nicht richtig verstanden habe, daher die Frage nach SO. Trotzdem danke! –

+0

FYI, für ein praktisches Beispiel der Verwendung von 'bereitgestellt 'siehe die Frage, [Enthalten eine Bibliothek während der Programmierung und Kompilierung, aber von Build, in NetBeans Maven-basierten Projekt auszuschließen] (https://stackoverflow.com/q/32087445/642706) –

Antwort

46

geschätzt werden Sie sind falsch/zweideutig über provided . Es bedeutet, "Dieses Glas sollte gegen lokal kompiliert werden, aber es wird auf dem Klassenpfad von etwas anderes während der Laufzeit bereitgestellt werden, also nicht in den Klassenpfad für mich enthalten." Zum Beispiel enthalten alle Webcontainer (z. B. tomcat) die Gläser für Servlets. Sie sollten provided für die Servlet-Klassen verwenden, damit Sie Ihren Code lokal kompilieren können, aber Sie nicht die Servlet-Klassen überschreiben möchten, die tomcat Ihnen bei der Bereitstellung bereitstellt.


system Mittel „Diese Abhängigkeiten sind auf mein System und ich möchte ihnen direkt Punkt“. Sie möchten dies vermeiden, weil eine andere Person auf einem anderen Computer nicht unbedingt diese Abhängigkeiten haben muss.

Der Unterschied zwischen provided ist leichter zu zeigen:

<dependency> 
    <groupId>javax.sql</groupId> 
    <artifactId>jdbc-stdext</artifactId> 
    <version>2.0</version> 
    <scope>system</scope> 
    <systemPath>${java.home}/lib/rt.jar</systemPath> 
</dependency> 

Sehen Sie, wie es das <systemPath> hat? Das ist der Unterschied. Sie geben den Pfad nicht mit provided an, vorausgesetzt, Sie wissen, wie Sie die Abhängigkeit von einem Repository abrufen können. system erhält es von Ihr Dateisystem nur.


Ich habe noch nie von import gehört. @JigarJoshi verbunden http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html, das besagt,

Import (nur in Maven 2.0.9 oder höher)

Dieser Bereich nur auf einer Abhängigkeit vom Typ pom im <dependencyManagement> Abschnitt verwendet wird. Es gibt an, dass das angegebene POM durch die Abhängigkeiten in diesem POM-Abschnitt ersetzt werden soll. Da sie ersetzt werden, tragen Abhängigkeiten mit einem Umfang des Imports tatsächlich nicht dazu bei, die Transitivität einer Abhängigkeit zu begrenzen.

ich denke, dies zu sagen ist, „nehmen alle Abhängigkeiten dieses Projekt hat und sie in diesem Abschnitt <dependencyManagement> inline.“ Jemand korrigiert mich, wenn ich falsch liege.

+0

Ja, das war mehrdeutig. Was ich meinte, war (für bereitgestellt) 'Ich habe die Abhängigkeiten auf meiner Maschine jetzt, also benutze sie momentan. Aber wenn Sie das Paket erstellen, machen Sie sich keine Sorgen um sie, da die Maschine, auf der ich diesen Code ausführen werde, die Abhängigkeiten hat und der Klassenpfad entsprechend eingestellt ist. Das ist das Gleiche, was du sagst, oder? –

15

finden Sie die genaue Bedeutung der Bereiche in Maven

I refered http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html

Abhängigkeit Umfang Maven verwendet, um die Transitivität einer Abhängigkeit zu begrenzen und auch den Klassenpfad für verschiedene Build-Aufgaben verwendet zu beeinflussen.

Es gibt 6 Bereiche zur Verfügung:

  • kompilieren:

    Dies ist der Standardbereich, verwendet werden, wenn keine angegeben ist. Kompilierabhängigkeiten sind in allen Klassenpfaden eines Projekts verfügbar. Darüber hinaus werden diese Abhängigkeiten an abhängige Projekte weitergegeben.

  • bereitgestellt:

    Dies ist ähnlich wie die Kompilierung, sondern zeigen Sie das JDK oder ein Container erwarten, dass die Abhängigkeit zur Laufzeit zur Verfügung zu stellen. Wenn Sie beispielsweise eine Webanwendung für die Java Enterprise Edition erstellen, würden Sie die Abhängigkeit von der Servlet-API und zugehörigen Java EE-APIs für den bereitgestellten Bereich festlegen, da der Webcontainer diese Klassen bereitstellt. Dieser Bereich ist nur für den Kompilierungs- und Testklassenpfad verfügbar und nicht transitiv.

  • Laufzeit:

    Dieser Bereich zeigt an, dass die Abhängigkeit nicht für die Kompilierung erforderlich ist, ist jedoch für die Ausführung. Es befindet sich in den Laufzeit- und Testklassenpfaden, nicht jedoch in dem Kompilierungsklassenpfad.

  • Test:

    Dieser Bereich zeigt an, dass die Abhängigkeit nicht für den normalen Gebrauch der Anwendung erforderlich ist, und ist nur für die Test Kompilierung und Ausführungsphasen zur Verfügung.

  • System:

    Dieser Bereich ist ähnlich, außer vorausgesetzt, dass Sie die JAR schaffen, die es explizit enthält. Das Artefakt ist immer verfügbar und wird nicht in einem Repository nachgeschlagen.

  • import (nur in Maven 2.0.9 oder später):

    Dieser Bereich wird nur auf einer Abhängigkeit vom Typ POM in dem Abschnitt verwendet. Es gibt an, dass das angegebene POM durch die Abhängigkeiten in diesem POM-Abschnitt ersetzt werden soll. Da sie ersetzt werden, tragen Abhängigkeiten mit einem Umfang des Imports tatsächlich nicht dazu bei, die Transitivität einer Abhängigkeit zu begrenzen.

+2

Lediglich das Zitieren des Dokuments ist hier nicht wirklich hilfreich. Dies ist ein kompliziertes Problem, das ** einige Erklärungen und Beispiele ** über den bloßen Satz oder zwei des Dokuments hinaus verwenden könnte. –