Jaka jest różnica w maven między tagami zależności i wtyczek w pom xml?

118

Jestem nowy w narzędziu Maven, stworzyłem projekt za pomocą Spring i Hibernate i są one skonfigurowane w pom.xml jako wtyczki, ale JUnit jest oznaczony jako zależność. Moje pytanie brzmi: jaka jest logika stojąca za jedną wtyczką, a drugą jako zależnością?

Koral
źródło

Odpowiedzi:

213

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!

r9891
źródło
Czy mogę ktoś mi powiedzieć, jaka jest różnica między fazą a celem w wykonaniu? Jak wiedziałem, faza mówi o cyklu życia mavena ... ale po co znowu cel? jakieś wskazówki? Czasami widzę, że ludzie stawiają na cel słowo kluczowe dotyczące cyklu życia ... ??? (?.?)
taymedee
@taymedee to pytanie SO opisuje różnicę: stackoverflow.com/questions/16205778/…
dev_feed
1
@ r981 Twoja odpowiedź musi być jaśniejsza. Ta odpowiedź jest lepsza: stackoverflow.com/questions/26292073/…
Cyfrowa nietrwałość
Myślę, że brakującym punktem tej odpowiedzi jest to, że: zależności najwyższego poziomu są używane głównie przez twój artefakt zamiast wtyczek.
Wolny
3
@MichaelPacheco, Miałem na myśli to, że spring-plugin wykona pewne zadanie wykonania zestawu kodu, który może być zależny od niektórych bibliotek, które będą określone przez „zależności”. Weźmy inny przykład: potrzebujesz kompilatora do wykonania fragmentu kodu; Tutaj, twój kompilator jest wtyczką, a twój kod jest plikiem wykonywalnym. Twój kompilator sam jest w stanie wykonać dowolny kod, ale twój kod może być zależny od biblioteki, powiedzmy Apache commons, która będzie zależnością. Twój kompilator może skompilować kod tylko wtedy, gdy zależności są obecne w ścieżce klas. Mam nadzieję, że teraz jest jasne.
r9891
37

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.

Andrew Logvinov
źródło
dzięki za szybką odpowiedź, przepraszam, ale nadal jestem zdezorientowany, ponieważ wiem, że JUnit jest również frameworkiem i (hibernacja, wiosna) również podlega tylko ramom, więc oznacza to, że w przypadkach (hibernacja, wiosna) można również skonfigurować w tagach zależności ? mam nadzieję, że masz moje pytanie.
Coral
Tak, iz tego co wiem, nie ma czegoś takiego jak wtyczka Spring Maven. Zwykle biblioteki Spring (lub Hibernate, JUnit lub TestNG itp.) Są deklarowane jako zależności dla twojego projektu. Jeśli jesteś nowy w maven, polecam przeczytanie tej bardzo dobrej książki.
Andrew Logvinov
@AndrewLogvinov - Mam projekt multi pom do testowania automatyzacji API. Jeden z projektów maven ma testy automatyzacji. Sekcja kompilacji projektu pom miała tylko 1 wtyczkę - pewną wtyczkę maven w odniesieniu do pakietu. Cały tag kompilacji został usunięty. Czy mógłbyś mi powiedzieć, co to oznacza? dzięki.
MasterJoe,
15

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 :buildreporting

  • Wtyczki kompilacji zostaną uruchomione podczas kompilacji i należy je skonfigurować w pliku <build/> elemencie z POM.
  • Wtyczki raportujące zostaną uruchomione podczas generowania strony i należy je skonfigurować w <reporting/elemencie> z POM.

Zgodnie z celem określonym w maven w wierszu poleceń (na przykład mvn clean, mvn clean packagealbo mvn site), specyficzny lifecyle zostaną wykorzystane oraz zestaw wtyczek specyficzna cele będą realizowane.
Istnieją trzy wbudowane w kompilacji cyklu życia: default, cleani site. Cykl defaultżycia obsługuje wdrożenie projektu, cleancykl ż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-pluginwiąże się domyślnie compileBramka 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>

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 scopeponiż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 managementczęści lub w jeszcze w plugindeklaracji ! 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 plugini dependencymoż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 ( JARdomyślnie) nie są często określane. Tak więc wspólny format w dependencydeklaracji 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 compilezależ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 testdla 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>
davidxxx
źródło
świetne wyjaśnienie !, ponieważ nie jestem dobrze zorientowany w konfigurowaniu zależności w Javie, nadal mam wątpliwości, obecnie pracuję w IntelliJ i stworzyłem projekt maven, kiedy próbowałem dołączyć webdriver-ie, mam dwie opcje, albo dołącz go jako pluginslub dependency, włączyłem oba do porównania i zauważyłem, że oba mają dokładnie to samo, groupIdjedyną różnicą było to, że pluginsnie pochodziły z konkretnej wersji, ale były dependencyz 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?
Anu
1
Trudno podać dokładną odpowiedź, nie widząc twojego 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)
davidxxx
1
Zwróć uwagę, że określenie wtyczki jest złym sposobem. Nie powoduje to, że twoja kompilacja jest odtwarzalna w czasie ( cwiki.apache.org/confluence/display/MAVEN/ ... ). Powinieneś zobaczyć ostrzeżenie w kompilacji. Więc „jaka jest różnica?”. Wtyczki wykonują zadania dla kompilacji Mavena, podczas gdy zależnościami są biblioteki (jar lub inne) potrzebne w ścieżce klas podczas kompilacji. Jeśli kompilacja twojego projektu jest taka sama, niezależnie od przypadku (używając biblioteki lub sposobu wtyczki), oznacza to, że wtyczka jest bezradna, ponieważ nie jest używana. (2/2)
davidxxx
6

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ąć.

Kevin
źródło
4

Wtyczki służą do dodawania do Mavensiebie funkcji (takich jak dodawanie eclipsewsparcia lub SpringBootwsparcia Mavenitp.). Zależności są wymagane przez kod źródłowy, aby przejść dowolną fazę Mavena ( compilelub testna przykład). W przypadku, JUnitgdy kod testowy jest w zasadzie częścią twojego kodu i wywołujesz JUnitokreślone polecenia wewnątrz zestawów testowych, a te polecenia nie są dostarczane przez, Java SDKdlatego JUnitmusi być obecny w momencie, gdy Mavenjest w fazie testowej i jest to obsługiwane przez JUnitpodanie jako zależności w swoim pom.xmlpliku.

coffeMug
źródło
1

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 etcdo 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) 
Himanshu Ahuja
źródło
1

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

Yogesh Rathi
źródło
0

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.

wtyczka i zależność

DeC
źródło