Antworten:
Sowohl Plugins als auch Abhängigkeiten sind Jar-Dateien.
Der Unterschied zwischen ihnen besteht jedoch darin, dass der größte Teil der Arbeit in Maven mit Plugins erledigt wird. Die Abhängigkeit ist nur eine Jar-Datei, die beim Ausführen der Aufgaben zum Klassenpfad hinzugefügt wird.
Beispielsweise verwenden Sie ein Compiler-Plugin, um die Java-Dateien zu kompilieren. Sie können das Compiler-Plugin nicht als Abhängigkeit verwenden, da dadurch nur das Plugin zum Klassenpfad hinzugefügt wird und keine Kompilierung ausgelöst wird. Die Jar-Dateien, die beim Kompilieren der Datei zum Klassenpfad hinzugefügt werden sollen, werden als Abhängigkeit angegeben.
Gleiches gilt für Ihr Szenario. Sie müssen das Spring-Plugin verwenden, um einige ausführbare Spring-Dateien auszuführen. [Ich bin nicht sicher, wofür Spring-Plugins verwendet werden. Ich rate hier nur]. Sie benötigen jedoch Abhängigkeiten, um diese ausführbaren Dateien auszuführen. Und Junit ist unter Abhängigkeit markiert, da es vom todsicheren Plugin zur Ausführung von Komponententests verwendet wird.
Wir können also sagen, dass das Plugin eine Jar-Datei ist, die die Aufgabe ausführt, und die Abhängigkeit eine Jar-Datei ist, die die Klassendateien zur Ausführung der Aufgabe bereitstellt.
Hoffe das beantwortet deine Frage!
Maven selbst kann als Küchenmaschine mit vielen verschiedenen Einheiten beschrieben werden, mit denen verschiedene Aufgaben ausgeführt werden können. Diese Einheiten werden Plugins genannt. Zum Beispiel, um Ihre Projekt-Maven-Kompilierungen zu kompilieren maven-compiler-plugin
, Tests auszuführen - maven-surefire-plugin
und so weiter.
Die Abhängigkeit in Bezug auf Maven ist ein Paket von Klassen, von denen Ihr Projekt abhängt. Dies kann JAR, Krieg usw. sein. Wenn Sie beispielsweise einen JUnit-Test schreiben möchten, müssen Sie JUnit-Annotationen und -Klassen verwenden. Daher müssen Sie erklären, dass Ihr Projekt von JUnit abhängt.
Plugins und Abhängigkeiten sind sehr unterschiedliche Dinge und diese ergänzen sich.
Plugins führen Aufgaben für einen Maven-Build aus. Diese sind nicht in der Anwendung enthalten.
Dies sind die Herzen von Maven.
Jede von Maven ausgeführte Aufgabe wird von Plugins ausgeführt .
Es gibt zwei Kategorien von Plugins: das build
und das reporting
Plugin :
<build/>
Element aus dem POM konfiguriert werden .<reporting/
Element> des POM konfiguriert werden . Nach dem Maven Ziel in der Befehlszeile angegeben (zum Beispiel mvn clean
, mvn clean package
oder mvn site
), eine spezifische lifecyle verwendet werden und eine bestimmte Gruppe von Plugins Zielen ausgeführt.
Es gibt drei Einbau-Build - Lifecycles: default
, clean
und site
. Der default
Lebenszyklus übernimmt Ihre Projektbereitstellung, der clean
Lebenszyklus die Projektbereinigung und der site
Lebenszyklus die Erstellung der Standortdokumentation Ihres Projekts.
Ein Plugin-Ziel kann an eine bestimmte Phase eines bestimmten Lebenszyklus gebunden sein.
Zum Beispiel maven-compiler-plugin
bindet das compile
Ziel standardmäßig an die Lebenszyklusphase : compile
.
Die meisten Maven-Plugins (sowohl Core-Plugins als auch Plugins von Drittanbietern) bevorzugen Konventionen gegenüber Konfigurationen. Daher haben diese ein Plugin-Ziel im Allgemeinen an eine bestimmte Phase gebunden, um ihre Verwendung zu vereinfachen.
Das ist ordentlicher und weniger fehleranfällig:
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
</plugin>
als :
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
</plugin>
Abhängigkeiten sind Maven-Artefakte / -Komponenten, die während des Maven-Builds im Klassenpfad erforderlich sind.
Diese können in der Anwendung enthalten sein, müssen aber nicht (siehe scope
unten).
Die meisten Abhängigkeiten sind jar, aber dies können auch andere Arten von Archiven sein: war, ear, test-jar, ejb-client ... oder immer noch POM oder BOM.
In einer pom.xml können Abhängigkeiten an mehreren Stellen angegeben werden: am <build><dependencies>
Teil, am dependencies management
Teil oder noch in einer plugin
Deklaration ! In der Tat müssen einige Plugins während ihrer Ausführung möglicherweise einige Abhängigkeiten im Klassenpfad aufweisen. Das ist nicht üblich, aber das kann passieren.
Hier ist ein Beispiel aus der Dokumentation , das dies zeigt plugin
und dependency
möglicherweise zusammenarbeitet:
Das Maven Antrun Plugin Version 1.2 verwendet beispielsweise Ant Version 1.6.5. Wenn Sie beim Ausführen dieses Plugins die neueste Ant-Version verwenden möchten, müssen Sie ein
<dependencies>
Element wie das folgende hinzufügen :
<project>
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.2</version>
...
<dependencies>
<dependency>
<groupId>org.apache.ant</groupId>
<artifactId>ant</artifactId>
<version>1.7.1</version>
</dependency>
<dependency>
<groupId>org.apache.ant</groupId>
<artifactId>ant-launcher</artifactId>
<version>1.7.1</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
...
</project>
In Maven wird auf Abhängigkeiten in einem bestimmten Format verwiesen :
groupId:artifactId:packaging:classifier:version
.
Der Klassifizierer (der optional ist) und die Verpackung ( JAR
standardmäßig) werden nicht allgemein angegeben. Das übliche Format in der dependency
Erklärung lautet also eher : groupId:artifactId:version
.
Hier ist ein Beispiel für die im <build><dependencies>
Teil deklarierte Abhängigkeit :
<build>
<dependencies>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.2.14.Final</version>
</dependency>
<dependencies>
</build>
Im Gegensatz zu einem Plugin hat eine Abhängigkeit einen Gültigkeitsbereich.
Der Standardbereich ist compile
. Dies ist der am häufigsten benötigte Bereich (Konvention über Konfiguration erneut).
Der compile
Bereich bedeutet, dass die Abhängigkeit in allen Klassenpfaden eines Projekts verfügbar ist.
Der Bereich definiert, in welchen Klassenpfaden die Abhängigkeit hinzugefügt werden soll. Benötigen wir es zum Beispiel zur Kompilierung und Laufzeit oder nur zum Kompilieren und Ausführen von Tests?
Zum Beispiel haben wir Hibernate zuvor als compile
Abhängigkeit definiert, wie wir sie überall brauchen: Quellkompilierung, Testkompilierung, Laufzeit usw.
Wir möchten jedoch nicht, dass Testbibliotheken in der Anwendung gepackt oder im Quellcode referenziert werden . Also geben wir den test
Umfang für sie an:
<build>
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.1.0</version>
<scope>test</scope>
</dependency>
<dependencies>
</build>
webdriver-ie
ich zwei Optionen, entweder als plugins
oder dependency
, ich habe beide zum Vergleich eingeschlossen und festgestellt, dass beide genau gleich sind. groupId
Der einzige Unterschied war, dass die plugins
nicht mit einer bestimmten Version geliefert wurden, sondern dependency
mit 0.6.685
. Könnten Sie es bitte in Laienbegriffen (in Bezug auf dieses Beispiel) erklären, was der Unterschied ist, welchen Sie wann verwenden sollten? Irgendein Vorschlag?
pom.xml
. Eine Sache, die Sie interessieren sollte, ist, dass die Angabe der Abhängigkeitsversion in jeder Maven-Version obligatorisch ist (im aktuellen POM oder im übergeordneten POM, wenn es sich um eine geerbte Abhängigkeit handelt), während seit Maven 3 (wahrscheinlich eine schlechte gute Idee als Feature). Die Angabe der Plugin-Version ist optional. Maven verwendet die letzte Version, die im Release-Repository verfügbar ist, in dem Maven sie findet. (1/2)
Wenn Sie aus einem Front-End-Hintergrund wie mir kommen und mit Grunt und npm vertraut sind, stellen Sie sich das so vor:
Zuerst würden Sie sagen, sagen npm install grunt-contrib-copy --save-dev
. Das ist wie bei Maven <dependency></dependency>
. Es lädt die Dateien herunter, die zum Ausführen einer Build-Aufgabe erforderlich sind.
Dann würden Sie die Aufgabe in Gruntfile.js konfigurieren
copy: {
main: {
src: 'src/*',
dest: 'dest/',
},
}
Das ist wie bei Maven <plugin>/<plugin>
. Sie teilen dem Build-Tool mit, was mit dem von npm / heruntergeladenen Code zu tun ist <dependency></dependency>
.
Natürlich ist dies keine exakte Analogie, aber nah genug, um Ihren Kopf darum zu wickeln.
Plug-Ins werden zum Hinzufügen von Funktionen zu sich Maven
selbst verwendet (z. B. Hinzufügen von eclipse
Support oder SpringBoot
Support zu Maven
usw.). Abhängigkeiten werden von Ihrem Quellcode benötigt, um eine Maven-Phase ( compile
oder test
zum Beispiel) zu bestehen. Im Falle der JUnit
seit der Testcode ist im Grunde ein Teil Ihrer Code - Basis und rufen Sie JUnit
bestimmte Befehle in Testsuiten und diese Befehle werden nicht von einer dritten Java SDK
daher JUnit
muss zum Zeitpunkt vorhanden sein , Maven
ist in der Testphase , und dies wird durch die Erwähnung behandelt JUnit
als Abhängigkeit in Ihrer pom.xml
Datei.
Maven ist das Herzstück eines Plugin-Ausführungsframeworks - gemäß formaler und standardmäßiger kompakter Definition. Um es klarer zu machen, verwenden Sie die Befehle maven-install/clean/compile/build etc
zum Erstellen / Ausführen von Jars, die wir manchmal auch manuell ausführen. Die Dinge, die Sie ausführen (oder konfigurieren oder ausführen) möchten, setzen Sie im Grunde genommen in das Abhängigkeitstag von mavens pom und die Antwort, wer diese Abhängigkeiten ausführen wird (für die Einrichtung der Umgebung erforderlich), sind die Plugins.
javac (compiler) dependency.java (dependency)
Einzeilige Antwort - Grundverständnis
Das Plugin ist ein Tool, das Sie bei der Ausführung Ihres Maven-Builds verwenden
Abhängigkeit bedeutet jede Art von Bibliothek, die Sie in Ihrem Code verwenden
Ein Plugin ist eine Erweiterung von Maven, die zur Herstellung Ihres Artefakts verwendet wird (Maven-Jar-Plugin zum Beispiel wird verwendet, um aus Ihren kompilierten Klassen und Ressourcen ein Jar zu erstellen).
Eine Abhängigkeit ist eine Bibliothek, die von der von Ihnen erstellten Anwendung zum Kompilieren und / oder Testen und / oder zur Laufzeit benötigt wird.