Jaka jest różnica / związek między celami i fazami Mavena? Jak są ze sobą powiązane?
Jaka jest różnica / związek między celami i fazami Mavena? Jak są ze sobą powiązane?
Odpowiedzi:
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ę.
mvn archetype:generate
w takim razie maven wykonuje tylko cel?
mvn test
dział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:test
a mvn compiler:testCompile
po prostu działa --- maven-compiler-plugin:3.1:testCompile ...
.
mvn clean compiler:testCompile
kończy się --- maven-clean-plugin:2.5:clean ... --- maven-compiler-plugin:3.1:testCompile
niepowodzeniem 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 MvnPhase
jest testowana klasa, do której odwołuje się klasa testowa). Najwyraźniej fazy nie są wywoływane, jeśli cel jest wywoływany wprost.
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 :
Każdy cykl życia kompilacji składa się z faz
Na przykład default
cykl ż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”. mvn
moż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:resources
cel związany z process-resources
fazą compiler:compile
i tak dalej, aż w końcu realizuje surefire:test
cel.
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. clean
I package
argumenty są fazy budowy, natomiast dependency:copy-dependencies
jest celem (z wtyczką).
mvn clean dependency:copy-dependencies package
Jeśli miałoby to zostać wykonane, clean
faza zostanie wykonana jako pierwsza (co oznacza, że uruchomi wszystkie poprzednie fazy czystego cyklu życia, plus clean
samą fazę), a następnie dependency:copy-dependencies
cel, zanim ostatecznie wykona package
fazę (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:
Próbka Eclipse do mapowania cyklu życia Maven
[plugin-name]
w tym przykładzie mvn [plugin-name]:[goal-name]
jest raczej prefiksem wtyczki . mvn clean install
można nie tylko „ stosować w scenariuszu wielomodułowym ”. Multi-moduł to zupełnie inny temat.
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
:
mvn compile
jest odwzorowany na konkretny cel, cel kompilacji.mvn compiler:compile
Dlatego faza składa się z celów wtyczek .
Link do referencji
mvn test
wskazuje package
i mvn install
wskazuje deploy
?
jar
wtyczka faktycznie działa w package
fazie. 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.
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:
Koło życia
Trzy wbudowane w cyklu życia (aka kompilacji cyklu życia ) default
, clean
, site
. ( Odniesienie cyklu życia )
Faza
Każdy cyklu składa się z etapów , na przykład do default
cyklu: compile
, test
, package
, install
, itd.
Podłącz
Artefakt, który zapewnia jeden lub więcej celów.
W zależności od rodzaju opakowań ( jar
, war
etc.) cele plugins' są zobowiązane do fazy domyślnie. ( Wbudowane wiązania cyklu życia )
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ą:
clean
, package
)<plugin-prefix>:<goal>
(np. dependency:copy-dependencies
)<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
Build Phase
, myślę o nim jako o kolejnej fazie cyklu życia i to mnie dezorientuje.
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.
Fazy pogrubione - są to najczęściej używane fazy główne.
generate-resources
pojawia się dwa razy i generate-sources
brakuje.
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:
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/
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
Istnieją trzy wbudowane cykle życia kompilacji:
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 mvn
np.mvn -X <your_goal>