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:generatew takim razie maven wykonuje tylko cel?
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 ....
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.
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 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:
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 installmoż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 compilejest odwzorowany na konkretny cel, cel kompilacji.mvn compiler:compileDlatego faza składa się z celów wtyczek .
Link do referencji
mvn testwskazuje packagei mvn installwskazuje deploy?
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.
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 defaultcyklu: 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, waretc.) 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-resourcespojawia się dwa razy i generate-sourcesbrakuje.
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 mvnnp.mvn -X <your_goal>