Jakie są cele i fazy Maven i jaka jest ich różnica?

Odpowiedzi:

251

Cele są wykonywane etapami, które pomagają określić, w jakim celu zostaną zrealizowane cele. Najlepszym zrozumieniem tego jest przyjrzenie się domyślnym powiązaniom cyklu życia Maven, które pokazują, które cele są uruchamiane w których fazach domyślnie. Cele fazy kompilacji będą zawsze wykonywane przed celami fazy testowej, które zawsze będą wykonywane przed celami fazy pakietu i tak dalej.

Część zamieszania pogarsza fakt, że podczas wykonywania maven możesz określić cel lub fazę. Jeśli określisz fazę, maven przeprowadzi wszystkie fazy do fazy określonej w kolejności (np. Jeśli określisz pakiet, najpierw przejdzie przez fazę kompilacji, a następnie fazę testową, a na koniec fazę pakietu) i dla każdej fazy będzie realizuj wszystkie cele związane z tą fazą.

Kiedy utworzysz wykonanie wtyczki w swoim pliku kompilacji Maven i określisz tylko cel, spowoduje to powiązanie go z daną domyślną fazą. Na przykład cel jaxb: xjc domyślnie wiąże się z fazą generowania zasobów. Jednak po określeniu wykonania można również jawnie określić fazę dla tego celu.

Jeśli określisz cel podczas wykonywania Maven, uruchomi on ten cel i tylko ten cel. Innymi słowy, jeśli podasz cel jar: jar, uruchomi on cel jar: jar, aby spakować kod do jar. Jeśli wcześniej nie uruchomiłeś celu kompilacji lub nie przygotowałeś skompilowanego kodu w inny sposób, może to nie powieść się.

Tempo
źródło
11
Przyzwyczaiłem się mówić „Maven przechodzi wszystkie fazy (aż do podanego)” zamiast „uruchamia” lub „wykonuje” (ten ostatni, jak to się nazywa we wstępie do cyklu życia Mavena ). Takie odróżnienie go wyraźniej od kodu celu, który jest naprawdę wykonywany. Ale to może być osobisty gust.
GeroldBroser przywraca Monikę
Ale możemy również realizować cele, które nie należą do żadnej fazy, tj. Czy mvn archetype:generatew takim razie maven wykonuje tylko cel?
Quazi Irfan
1
@Pace Czy masz odniesienie do ostatniego akapitu? Wątpiłem w to i wypróbowałem to w prostym projekcie tutaj: mvn testdziała:, --- maven-resources-plugin:2.6:resources ... --- maven-compiler-plugin:3.1:compile ... --- maven-resources-plugin:2.6:testResources ... --- maven-compiler-plugin:3.1:testCompile ... --- maven-surefire-plugin:2.12.4:testa mvn compiler:testCompilepo prostu działa --- maven-compiler-plugin:3.1:testCompile ....
GeroldBroser przywraca Monikę
4
Uruchomienie @Pace mvn clean compiler:testCompilekończy się --- maven-clean-plugin:2.5:clean ... --- maven-compiler-plugin:3.1:testCompileniepowodzeniem Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:testCompile (default-cli) on project mvnphase: Compilation failure ... cannot find symbol ... symbol: variable MvnPhase(gdzie MvnPhasejest testowana klasa, do której odwołuje się klasa testowa). Najwyraźniej fazy nie są wywoływane, jeśli cel jest wywoływany wprost.
GeroldBroser przywraca Monikę
1
Na podstawie informacji uzyskanych od geroldbroser i @ kekko12 zaktualizowałem ostatni akapit, aby stwierdzić, że gdy określony jest cel, uruchamiany jest tylko ten cel, a nie wszystkie poprzednie fazy.
Tempo
188

Cykl życia to sekwencja nazwanych faz .
Fazy ​​są wykonywane sekwencyjnie. Wykonanie fazy oznacza wykonanie wszystkich poprzednich faz.

Wtyczka jest zbiorem celów zwanych także MOJO ( M aven O ld J ava O bject).
Analogia: wtyczka jest klasą, a cele są metodami w klasie.

Maven opiera się na centralnej koncepcji cyklu życia kompilacji . Wewnątrz każdego cyklu życia fazy budowy znajdują się fazy budowy , a wewnątrz każdej fazy budowy znajdują się cele budowy .

Możemy wykonać fazę kompilacji lub cel kompilacji. Podczas wykonywania fazy kompilacji realizujemy wszystkie cele kompilacji w tej fazie kompilacji. Cele kompilacji są przypisane do jednej lub kilku faz kompilacji. Możemy również wykonać cel kompilacji bezpośrednio.

Istnieją trzy główne wbudowane cykle życia kompilacji :

  1. domyślna
  2. czysty
  3. teren

Każdy cykl życia kompilacji składa się z faz

Na przykład defaultcykl życia składa się z następujących faz kompilacji :

◾validate - validate the project is correct and all necessary information is available
◾compile - compile the source code of the project
◾test - test the compiled source code using a suitable unit testing framework. These tests should not require the code be packaged or deployed
◾package - take the compiled code and package it in its distributable format, such as a JAR.
◾integration-test - process and deploy the package if necessary into an environment where integration tests can be run
◾verify - run any checks to verify the package is valid and meets quality criteria
◾install - install the package into the local repository, for use as a dependency in other projects locally
◾deploy - done in an integration or release environment, copies the final package to the remote repository for sharing with other developers and projects.

Aby przejść przez powyższe fazy, musimy tylko wywołać jedno polecenie:

mvn <phase> { Ex: mvn install }

W przypadku powyższego polecenia, począwszy od pierwszej fazy, wszystkie fazy są wykonywane sekwencyjnie, aż do fazy „instalacji”. mvnmoże wykonać cel lub fazę (lub nawet wiele celów lub wiele faz) w następujący sposób:

mvn clean install plugin:goal  

Jeśli jednak chcesz dostosować prefiks używany do odwoływania się do wtyczki, możesz określić prefiks bezpośrednio poprzez parametr konfiguracyjny na POMmaven-plugin-plugin w wtyczce.

Faza kompilacji składa się z celów wtyczek

Większość funkcji Maven znajduje się we wtyczkach. Wtyczka zapewnia zestaw celów, które można wykonać przy użyciu następującej składni:

 mvn [plugin-name]:[goal-name]

Na przykład projekt Java można skompilować z celem kompilacji wtyczki kompilatora, uruchamiając go mvn compiler:compile.

Cykl życia kompilacji to lista nazwanych faz, których można użyć do nadania kolejności realizacji celu.

Cele zapewniane przez wtyczki mogą być powiązane z różnymi fazami cyklu życia. Na przykład domyślnie cel compiler:compile jest powiązany z compile fazą , podczas gdy cel surefire:test jest powiązany z test fazą . Rozważ następujące polecenie:

mvn test

Po wykonaniu poprzedniego polecenia Maven wykonuje wszystkie cele związane z każdą z faz aż do fazy włącznie test. W takim przypadku Maven realizuje resources:resourcescel związany z process-resourcesfazą compiler:compilei tak dalej, aż w końcu realizuje surefire:testcel.

Jednak nawet jeśli faza kompilacji odpowiada za konkretny etap cyklu kompilacji, sposób, w jaki wykonuje te obowiązki, może być różny. Odbywa się to poprzez zadeklarowanie celów wtyczek związanych z tymi fazami kompilacji.

Cel wtyczki reprezentuje określone zadanie (lepsze niż faza kompilacji), które przyczynia się do budowy i zarządzania projektem. Może być związany z zerową lub większą liczbą faz kompilacji. Cel niezwiązany z żadną fazą kompilacji można wykonać poza cyklem kompilacji przez bezpośrednie wywołanie. Kolejność wykonywania zależy od kolejności, w której wywoływane są cele i fazy kompilacji. Rozważmy na przykład poniższe polecenie. cleanI packageargumenty są fazy budowy, natomiast dependency:copy-dependenciesjest celem (z wtyczką).

mvn clean dependency:copy-dependencies package

Jeśli miałoby to zostać wykonane, cleanfaza zostanie wykonana jako pierwsza (co oznacza, że ​​uruchomi wszystkie poprzednie fazy czystego cyklu życia, plus cleansamą fazę), a następnie dependency:copy-dependenciescel, zanim ostatecznie wykona packagefazę (i wszystkie poprzednie fazy budowania domyślny cykl życia).

Co więcej, jeśli cel jest związany z jedną lub większą liczbą faz budowy, cel ten zostanie wywołany we wszystkich tych fazach.

Co więcej, faza kompilacji może wiązać się z zero lub większą liczbą celów. Jeśli w fazie kompilacji nie ma żadnych celów, faza kompilacji nie zostanie wykonana. Ale jeśli ma do tego przypisany jeden lub więcej celów, zrealizuje wszystkie te cele.

Wbudowane powiązania cyklu życia
Niektóre fazy mają domyślnie powiązane cele. W domyślnym cyklu życia powiązania te zależą od wartości opakowania.

Architektura Maven:

wprowadź opis zdjęcia tutaj

Odniesienie 1
Odniesienie 2

Próbka Eclipse do mapowania cyklu życia Maven

Próbka Eclipse do mapowania cyklu życia Maven

Premraj
źródło
Jeśli mam 2 profile, czy mogę najpierw uruchomić wszystkie wtyczki profilu 1, a następnie profilu 2?
Pszczoła
[plugin-name]w tym przykładzie mvn [plugin-name]:[goal-name]jest raczej prefiksem wtyczki . mvn clean installmożna nie tylko „ stosować w scenariuszu wielomodułowym ”. Multi-moduł to zupełnie inny temat.
GeroldBroser przywraca Monikę
Czy cele przypisane do tej samej fazy są zgodne z jakimkolwiek zamówieniem?
węgorz ghEEz
5
Większość tego tekstu jest kopiowana dosłownie z dokumentacji Maven . Należy to jasno stwierdzić!
Lii
niesamowite źródło!
Bobo
45

Wybrana odpowiedź jest świetna, ale nadal chciałbym dodać do tematu coś małego. Ilustracja.

Wyraźnie pokazuje, w jaki sposób różne fazy łączyły się z różnymi wtyczkami oraz cele, które te wtyczki ujawniają.

Przeanalizujmy więc przypadek uruchomienia czegoś takiego mvn compile:

  • Jest to faza, która wykonuje wtyczkę kompilatora z celem kompilacji
  • Wtyczka kompilatora ma różne cele. Ponieważ mvn compilejest odwzorowany na konkretny cel, cel kompilacji.
  • To tak samo jak bieganie mvn compiler:compile

Dlatego faza składa się z celów wtyczek .

wprowadź opis zdjęcia tutaj

Link do referencji

Jasio
źródło
20
dlaczego mvn testwskazuje packagei mvn installwskazuje deploy?
Abdull,
2
Wygląda jak błąd ilustracji, dziękuję za zauważenie (założyłem go w sieci).
Johnny,
3
Skąd masz ilustrację? Czy sprawdziłeś prawa autorskie i warunki użytkowania?
Abdull,
1
@Abdull zdjęcie zrobione tutaj carminespagnuolo.eu/otheractivities/tutorato/PR-2014-2015/... (i pojawia się również na wielu innych stronach internetowych) dodając je do odpowiedzi. Dzięki za podniesienie tego punktu, nie byłem świadomy jego znaczenia.
Johnny
1
Wskaźniki od faz do wtyczek na schemacie też nie są całkiem poprawne, jarwtyczka faktycznie działa w packagefazie. Pom pom w kanapce między fazami i wtyczkami jest nieco mylące (zakładam, że powinno to oznaczać, że w pom można skonfigurować, które wtyczki działają w poszczególnych fazach, oprócz domyślnych powiązań). Ogólna zasada jest jednak słuszna.
Alexander Klimetschek,
43

Definicje są szczegółowo opisane na stronie witryny Maven Wprowadzenie do cyklu życia kompilacji , ale próbowałem podsumować :

Maven definiuje 4 elementy procesu kompilacji:

  1. Koło życia

    Trzy wbudowane w cyklu życia (aka kompilacji cyklu życia ) default, clean, site. ( Odniesienie cyklu życia )

  2. Faza

    Każdy cyklu składa się z etapów , na przykład do defaultcyklu: compile, test, package, install, itd.

  3. Podłącz

    Artefakt, który zapewnia jeden lub więcej celów.

    W zależności od rodzaju opakowań ( jar, waretc.) cele plugins' są zobowiązane do fazy domyślnie. ( Wbudowane wiązania cyklu życia )

  4. Cel

    Zadanie (akcja), które jest wykonywane. Wtyczka może mieć jeden lub więcej celów.

    Podczas konfigurowania wtyczki w POM należy określić co najmniej jeden cel . Ponadto w przypadku, gdy wtyczka nie ma zdefiniowanej domyślnej fazy, określone cele mogą zostać powiązane z fazą.

Maven można wywołać za pomocą:

  1. fazy (na przykład clean, package)
  2. <plugin-prefix>:<goal>(np. dependency:copy-dependencies)
  3. <plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>(np. org.apache.maven.plugins:maven-compiler-plugin:3.7.0:compile)

z jedną lub większą liczbą kombinacji dowolnej lub wszystkich, np .:

mvn clean dependency:copy-dependencies package
Sandeep Jindal
źródło
Jedynie fazy cyklu życia mają sens jako „kroki” (procesu kompilacji). Wolę nazwać to 4 bytami / przedmiotami / rzeczami .
GeroldBroser przywraca Monikę
Kiedy widzę świat Build Phase, myślę o nim jako o kolejnej fazie cyklu życia i to mnie dezorientuje.
Quazi Irfan
26

Wierzę, że dobra odpowiedź jest już zapewnione, ale chciałbym dodać łatwy do naśladowania schemat różnych cykli życiowych 3 ( build, clean, i site) oraz faz w każdej.

wprowadź opis zdjęcia tutaj

Fazy ​​pogrubione - są to najczęściej używane fazy główne.

Lior Bar-On
źródło
2
generate-resourcespojawia się dwa razy i generate-sourcesbrakuje.
elingerojo
12

Podziękowania dla Sandeep Jindal i Premraj. Ich wyjaśnienia pomagają mi zrozumieć po tym, jak przez pewien czas jestem zdezorientowany.

Stworzyłem tutaj kilka pełnych przykładów kodu i kilka prostych wyjaśnień https://www.surasint.com/maven-life-cycle-phase-and-goal-easy-explained/ . Myślę, że może to pomóc innym zrozumieć.

Krótko mówiąc, nie powinieneś próbować zrozumieć wszystkich trzech naraz, najpierw powinieneś zrozumieć relacje w tych grupach:

  • Cykl życia a faza
  • Wtyczka vs cel

1. Cykl życia a faza

Cykl życia to zbiór etapów w sekwencji zobacz tutaj Referencje cyklu życia . Kiedy wywołasz fazę , wywoła ona również wszystkie fazy przed nią.

Na przykład cykl czyszczenia składa się z 3 faz ( czyszczenie wstępne, czyszczenie, czyszczenie końcowe ).

mvn clean

Zadzwoni do czyszczenia wstępnego i czyszczenia .

2. Wtyczka vs cel

Cel jest jak akcja we wtyczce . Więc jeśli wtyczka jest klasą, celem jest metoda.

możesz nazwać taki cel:

mvn clean:clean

Oznacza to „zadzwoń do czystego celu w czystej wtyczce” (Nic nie odnosi się tutaj do fazy czystej. Nie pozwól, aby słowo „czyste” myliło cię, nie są takie same!)

3. Teraz związek między fazą a celem:

Faza może (wstępnie) prowadzić do celu ( celów ). Na przykład normalnie faza czysta łączy się z czystym celem. Po wywołaniu tego polecenia:

mvn clean

Wywoła fazę czyszczenia wstępnego i fazę czyszczenia, która łączy się z celem czyszczenia: czyszczenia.

Jest prawie taki sam jak:

mvn pre-clean clean:clean

Więcej szczegółów i pełne przykłady można znaleźć na https://www.surasint.com/maven-life-cycle-phase-and-goal-easy-explained/

Surasin Tancharoen
źródło
2

Maven działająca terminologia mająca fazy i cele.

Faza: Faza Maven to zestaw akcji, który jest powiązany z 2 lub 3 celami

exmaple: - jeśli uruchomisz mvn clean

to faza wykona cel mvn clean: clean

Cel: cel Maven związany z fazą

w celach informacyjnych http://books.sonatype.com/mvnref-book/reference/lifecycle-sect-structure.html

Venky Vungarala
źródło
4
Nie musi to być „kojarzone z 2 lub 3 celami” . Może to być również brak , jeden lub więcej niż trzy .
GeroldBroser przywraca Monikę
1

Istnieją trzy wbudowane cykle życia kompilacji:

  • domyślna
  • czysty
  • teren

Domyślny cykl życia -> [sprawdź, zainicjuj, wygeneruj-źródła, procesy-źródła, wygeneruj-zasoby, procesy-zasoby, kompiluj, klasy procesów, wygeneruj-przetestuj-źródła, proces-przetestuj-źródła, wygeneruj-przetestuj-zasoby, proces -test-resources, test-kompilacja, testy procesu-klasy, testy, przygotowanie pakietu, pakiet, test przed integracją, test integracji, test po integracji, weryfikacja, instalacja, wdrożenie]

Cykl życia czysty -> [czyszczenie wstępne, czyszczenie, czyszczenie końcowe]

Cykl życia witryny -> [instalacja wstępna, witryna, witryna po instalacji, wdrożenie witryny]

Przepływ jest sekwencyjny, na przykład w domyślnym cyklu życia, zaczyna się od sprawdzania poprawności , a następnie inicjalizacji i tak dalej ...

Możesz sprawdzić cykl życia, włączając tryb debugowania mvnnp.mvn -X <your_goal>

Vishrant
źródło