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.
źródło
Wtyczki i zależności to bardzo różne rzeczy, które się uzupełniają.
Jakie są wtyczki?
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
albomvn site
), specyficzny lifecyle zostaną wykorzystane oraz zestaw wtyczek specyficzna cele będą realizowane.Istnieją trzy wbudowane w kompilacji cyklu życia:
default
,clean
isite
. Cykldefault
ż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ślniecompile
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:
niż :
Jakie są zależności?
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, wdependencies management
części lub w jeszcze wplugin
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
idependency
może współpracować: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 wdependency
deklaracji jest raczej:groupId:artifactId:version
.Oto przykład zależności zadeklarowanej w
<build><dependencies>
części: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:źródło
webdriver-ie
, mam dwie opcje, albo dołącz go jakoplugins
lubdependency
, 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, żeplugins
nie pochodziły z konkretnej wersji, ale byłydependency
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
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ąć.
źródło
Wtyczki służą do dodawania do
Maven
siebie funkcji (takich jak dodawanieeclipse
wsparcia lubSpringBoot
wsparciaMaven
itp.). Zależności są wymagane przez kod źródłowy, aby przejść dowolną fazę Mavena (compile
lubtest
na przykład). W przypadku,JUnit
gdy kod testowy jest w zasadzie częścią twojego kodu i wywołujeszJUnit
określone polecenia wewnątrz zestawów testowych, a te polecenia nie są dostarczane przez,Java SDK
dlategoJUnit
musi być obecny w momencie, gdyMaven
jest w fazie testowej i jest to obsługiwane przezJUnit
podanie jako zależności w swoimpom.xml
pliku.źródło
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.źródło
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
źródło
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.
źródło