Odpowiedzi:
Zarówno wtyczki, jak i zależności są plikami JAR.
Ale różnica między nimi polega na tym, że większość pracy w maven jest wykonywana za pomocą wtyczek; podczas gdy zależność to tylko plik JAR, który zostanie dodany do ścieżki klas podczas wykonywania zadań.
Na przykład, używasz wtyczki kompilatora do kompilowania plików java. Nie możesz użyć wtyczki kompilatora jako zależności, ponieważ spowoduje to tylko dodanie wtyczki do ścieżki klas i nie uruchomi żadnej kompilacji. Pliki JAR, które mają zostać dodane do ścieżki klas podczas kompilowania pliku, zostaną określone jako zależność.
To samo dotyczy twojego scenariusza. Musisz użyć spring-plugin, aby uruchomić niektóre sprężynowe pliki wykonywalne [Nie jestem pewien, do czego służą spring-pluginy. Zgaduję]. Ale potrzebujesz zależności, aby wykonać te pliki wykonywalne. Junit jest oznaczony jako zależność, ponieważ jest używany przez wtyczkę surefire do wykonywania testów jednostkowych.
Możemy więc powiedzieć, że wtyczka to plik JAR, który wykonuje zadanie, a zależność to Jar, który zapewnia pliki klas do wykonania zadania.
Mam nadzieję, że to odpowiedź na Twoje pytanie!
Sam Maven można opisać jako robot kuchenny, który ma wiele różnych jednostek, które mogą być używane do wykonywania różnych zadań. Te jednostki nazywane są wtyczkami. Na przykład, aby skompilować Twój projekt, którego używa maven maven-compiler-plugin
, aby uruchomić testy -maven-surefire-plugin
i tak dalej.
Zależność w zakresie maven to spakowany fragment klas, od których zależy twój projekt. Może to być słoik, wojna itp. Na przykład, jeśli chcesz mieć możliwość napisania testu JUnit, będziesz musiał użyć adnotacji i klas JUnit, więc musisz zadeklarować, że Twój projekt zależy od JUnit.
Wtyczki i zależności to bardzo różne rzeczy, które się uzupełniają.
Wtyczki wykonują zadania dla kompilacji Mavena. Nie są one zawarte w aplikacji.
To jest serce Mavena.
Każde zadanie wykonywane przez Mavena jest wykonywane przez wtyczki .
Istnieją dwa rodzaje wtyczek: i wtyczek :build
reporting
<build/>
elemencie z POM.<reporting/
elemencie> z POM. Zgodnie z celem określonym w maven w wierszu poleceń (na przykład mvn clean
, mvn clean package
albo mvn site
), specyficzny lifecyle zostaną wykorzystane oraz zestaw wtyczek specyficzna cele będą realizowane.
Istnieją trzy wbudowane w kompilacji cyklu życia: default
, clean
i site
. Cykl default
życia obsługuje wdrożenie projektu, clean
cykl życia obsługuje czyszczenie projektu, podczas gdysite
cykl życia obejmuje tworzenie dokumentacji witryny projektu.
Cel wtyczki może być powiązany z określoną fazą określonego stylu życia.
Na przykład maven-compiler-plugin
wiąże się domyślnie compile
Bramka do fazy cyklu życia: compile
.
Większość wtyczek maven (zarówno rdzeniowych, jak i zewnętrznych) preferuje konwencję zamiast konfiguracji. Więc generalnie ograniczały one cel wtyczki do określonej fazy, aby ich użycie było prostsze.
To jest schludniejsze i mniej podatne na błędy:
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
</plugin>
niż :
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
</plugin>
Zależności to artefakty / komponenty Mavena wymagane w ścieżce klas podczas kompilacji Mavena.
Mogą one być zawarte w aplikacji, ale niekoniecznie (patrz scope
poniżej).
Większość zależności to jar, ale mogą to być również inne rodzaje archiwów: war, ear, test-jar, ejb-client ... lub nadal POM lub BOM.
W pom.xml, zależności może być określona w wielu miejscach: w <build><dependencies>
części, w dependencies management
części lub w jeszcze w plugin
deklaracji ! Rzeczywiście, niektóre wtyczki mogą wymagać pewnych zależności w ścieżce klas podczas ich wykonywania. To nie jest powszechne, ale może się zdarzyć.
Oto przykład z dokumentacji, który to pokazuje plugin
i dependency
może współpracować:
Na przykład wtyczka Maven Antrun w wersji 1.2 używa Ant w wersji 1.6.5, jeśli chcesz używać najnowszej wersji Ant podczas uruchamiania tej wtyczki, musisz dodać
<dependencies>
element taki jak następujący:
<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>
W Maven, zależności są odniesione w formacie specyficznym:
groupId:artifactId:packaging:classifier:version
.
Klasyfikator (który jest opcjonalny) i opakowanie ( JAR
domyślnie) nie są często określane. Tak więc wspólny format w dependency
deklaracji jest raczej: groupId:artifactId:version
.
Oto przykład zależności zadeklarowanej w <build><dependencies>
części:
<build>
<dependencies>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.2.14.Final</version>
</dependency>
<dependencies>
</build>
W przeciwieństwie do wtyczki zależność ma zasięg.
Domyślny zakres to compile
. Jest to najczęściej potrzebny zakres (ponownie konwencja zamiast konfiguracji). Zakres oznacza, że zależność jest dostępny we wszystkich ścieżek klas projektu. compile
Zakres określa, w których ścieżkach klas należy dodać zależność. Na przykład, czy potrzebujemy go podczas kompilacji i uruchamiania, czy tylko do kompilacji i wykonywania testów?
Na przykład wcześniej zdefiniowaliśmy Hibernate jako compile
zależność, ponieważ potrzebujemy jej wszędzie: kompilacja źródła, kompilacja testów, środowisko uruchomieniowe itd.,
Ale nie chcemy, aby biblioteki testowe były pakowane w aplikacji lub odwoływały się do kodu źródłowego . Więc określamy test
dla nich zakres:
<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
, mam dwie opcje, albo dołącz go jako plugins
lub dependency
, włączyłem oba do porównania i zauważyłem, że oba mają dokładnie to samo, groupId
jedyną różnicą było to, że plugins
nie pochodziły z konkretnej wersji, ale były dependency
z nią 0.6.685
. Czy mógłbyś wyjaśnić to w języku laika (w odniesieniu do tego przykładu), jaka jest różnica, którego użyć, kiedy. Jakieś sugestie?
pom.xml
. Ale rzeczą, która powinna Cię zainteresować, jest to, że określenie wersji zależności jest obowiązkowe (w bieżącym pom lub w pom nadrzędnym, jeśli jest to zależność dziedziczna) w każdej wersji Mavena, podczas gdy od Maven 3 (prawdopodobnie zły pomysł jako funkcja), określenie wersji wtyczki jest opcjonalne. Maven użyje ostatniej wersji dostępnej w repozytorium wydania, w którym Maven ją znajdzie. (1/2)
Jeśli pochodzisz z zaplecza, takiego jak ja, i znasz Grunt i npm, pomyśl o tym w ten sposób:
Pierwszy chcesz uruchomić, powiedzmy npm install grunt-contrib-copy --save-dev
. To jest jak maven <dependency></dependency>
. Pobiera pliki potrzebne do wykonania zadania kompilacji.
Następnie skonfigurowałbyś zadanie w Gruntfile.js
copy: {
main: {
src: 'src/*',
dest: 'dest/',
},
}
To jest jak maven <plugin>/<plugin>
. Mówisz narzędziu do kompilacji, co ma zrobić z kodem pobranym przez npm / <dependency></dependency>
.
Oczywiście nie jest to dokładna analogia, ale wystarczająco bliska, aby pomóc ci to ogarnąć.
Wtyczki służą do dodawania do Maven
siebie funkcji (takich jak dodawanie eclipse
wsparcia lub SpringBoot
wsparcia Maven
itp.). Zależności są wymagane przez kod źródłowy, aby przejść dowolną fazę Mavena ( compile
lub test
na przykład). W przypadku, JUnit
gdy kod testowy jest w zasadzie częścią twojego kodu i wywołujesz JUnit
określone polecenia wewnątrz zestawów testowych, a te polecenia nie są dostarczane przez, Java SDK
dlatego JUnit
musi być obecny w momencie, gdy Maven
jest w fazie testowej i jest to obsługiwane przez JUnit
podanie jako zależności w swoim pom.xml
pliku.
Maven w jego sercu to framework do wykonywania wtyczek - zgodnie z formalną i standardową zwartą definicją. Aby było jaśniej, polecenia, których używasz, są takie jak maven-install/clean/compile/build etc
do tworzenia / wykonywania słoików, które czasami uruchamiamy również ręcznie. Tak więc rzeczy, które chcesz uruchomić (lub skonfigurować lub wykonać), po prostu umieszczasz je w tagu zależności w mavens pom, a odpowiedź, aby wiedzieć, kto będzie uruchamiał te zależności (wymagane do konfiguracji środowiska), to wtyczki.
javac (compiler) dependency.java (dependency)
Jedna linia odpowiedzi - podstawowe zrozumienie
Wtyczka to narzędzie, którego używasz do wykonywania kompilacji mavena
Zależność oznacza rodzaj dowolnej biblioteki, której będziesz używać w swoim kodzie
Wtyczka jest rozszerzeniem Mavena, czymś, co służy do tworzenia twojego artefaktu (na przykład wtyczka maven-jar-jest używana, jak domyślasz się, do tworzenia jar ze skompilowanych klas i zasobów).
Zależność to biblioteka potrzebna aplikacji, którą tworzysz, podczas kompilacji i / lub testowania i / lub czasu wykonywania.