Maven: cykl życia kontra faza vs. wtyczka vs. cel [zamknięte]

106

Względnie nowy programista tutaj, mimo że używam go od jakiegoś czasu, mam nadzieję ugruntować podstawy Mavena. Część mojego problemu polega na tym, że nie mam doświadczenia z Ant, co wydaje się być przyczyną wielu wyjaśnień. Czytałem i oglądałem samouczki i ciągle słyszę te same terminy:

  • Koło życia
  • Faza
  • Podłącz
  • Cel

Z tego, czego się dowiedziałem, wydaje się, że cykl życia jest najszerszy z tego zbioru i składa się z (lub jest zakończony) fazami, wtyczkami i / lub celami.

Pytanie : Czy możesz podać jakieś informacje na temat powiązań tych terminów i najczęstszych przykładów?

Im bardziej wyraźne i podstawowe, tym lepiej!

Jeff Levine
źródło
Dzięki @Drejc - nie mogę uwierzyć, że nie znalazłem tego podczas wyszukiwania. Przeczytam to teraz.
Jeff Levine,
2
Tak więc, aby wyjaśnić, cykl życia kompilacji = cykl życia , których są trzy typy: domyślny, czysty i witryna? Inne wyjaśnienia sprawiły, że pomyślałem, że istnieje czwarty cykl życia zwany budową .
Jeff Levine,
3
Zbyt szeroki? Dotyczy to podstawowych podstaw Mavena i ma kilka dobrych i szczegółowych odpowiedzi. Moderatorzy bez jednego tagu maven nie powinni mieć prawa o tym decydować.
Gerold Broser

Odpowiedzi:

73

Cykl życia Mavena to (abstrakcyjna) koncepcja, która obejmuje wszystkie etapy (lub lepiej: wszystkie kroki, które projektanci Maven zdecydowali się wspierać), które mają wystąpić w trakcie rozwoju projektu. Te kroki (lub etapy) nazywanefazami w terminologii Mavena.

Plugin Maven jest kontenerem dla / dostawcy celów. Kod zaimplementowany w celach to prawdziwy koń pociągowy. ( Maven w swoim rdzeniu to po prostu zarządzanie wtyczkami i wykonywanie celów ). Każdy z celów wtyczki można przypisać / powiązać z dowolną fazą cyklu życia.

Podczas wywoływania mvn <phase> Maven przechodzi wszystkie fazy (za każdym razem) i wykonuje wszystkie cele (dostarczane przez wtyczki) , które zostały powiązane z dowolną fazą przed i do (włącznie) danej fazy. Jeśli jest faza bez celu, nic się nie dzieje. Niemniej jednak faza minęła.

Oznacza to, że nie można „wstawiać” dodatkowych faz ” do jednego z wbudowanych cykli życia Mavena. Oni już tam są, zawsze! Możesz opracować swój własny cykl życia z własnymi fazami, ale to znacznie wykracza poza zwykłe używanie Mavena w takiej postaci.

Cele mogą być również realizowane bezpośrednio, o czym informuje się podczas biegania mvnbez żadnej fazy lub celu [z przerwami między wierszami i skróconymi dla czytelności tutaj]:

You must specify a valid lifecycle phase or a goal in the format

<plugin-prefix>:<goal> or

<plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>.

Available lifecycle phases are:

... see actual output or 'Maven, Introduction to the Build Lifecycle' at 'References' below ...

Bibliografia:

Jeśli kiedykolwiek zastanawiałeś się, skąd Maven wie, co robić bez wiązania celu w POM, default-bindings.xmlna końcu znajduje się link do <Your Maven installation>/lib/maven-core-x.y.z.jar/META-INF/plexus/default-bindings.xml.

Fazy dla wbudowanego w cyklu życia ( czysty , domyślny , witryny ) deklarowane są <Your Maven installation>/lib/maven-core-x.y.z.jar/META-INF/plexus/components.xmlniedostatecznie .../<component>/<role>org.apache.maven.lifecycle.Lifecycle.

Gerold Broser
źródło
41

Maven: cykl życia vs. faza vs. wtyczka vs. cel

Odpowiadanie późno, aby wyjaśnić jeszcze jeden poziom szczegółowości, którego brakuje w tym wątku: egzekucje (celu), które są najmniejszymi jednostkami w kompilacji Mavena.

W związku z tym mamy cykle kompilacji (w zasadzie zestaw działań dla określonego celu ogólnego), które składają się z faz (mniejsza szczegółowość, krok cyklu), które mogą wywoływać zestaw skonfigurowanych celów dostarczanych przez niektóre wtyczki . Oznacza to, że Maven jest (również) wykonawcą wtyczki, każda wtyczka może oferować jeden lub więcej celów. Następnie (również) decydujesz, który cel jest powiązany z którą fazą, przez większość czasu w domyślnym cyklu życia (bez żadnego, to znaczy domyślnego). Ale możesz mieć jeszcze inny poziom: wykonanie (tego samego celu, z tej samej wtyczki lub różnych celów z różnych wtyczek)

Zdjęcie, które przygotowałem, aby wznowić całość wprowadź opis obrazu tutaj

I rzeczywiście w ten sposób Maven pokazuje to (najmniejszą jednostkę pracy) za pomocą unikalnego ciągu w dzienniku kompilacji:

plugin-artifactId:plugin-version:plugin-goal (goal-execution-id) @ project-name

Na przykład mielibyśmy:

[INFO] --- maven-compiler-plugin:2.5.1:compile (default-compile) @ sample-project ---

Co w istocie oznacza (poprzez różne poziomy szczegółowości):

  • w compilefazie (niestety nie wspomniano)>
  • Wywołuję wtyczkę Maven Compiler ( artifactIdi version)>
  • Przywołuję jego compilecel>
  • zgodnie z default-compilewykonaniem

Jest wyjątkowy, ponieważ rzeczywiście możesz mieć ten sam cel (tej samej wtyczki) powiązany z różnymi fazami lub z tą samą fazą, ale w różnych wykonaniach (to znaczy z różnymi konfiguracjami). Na maven-compiler-pluginprzykład jest również używany podczas test-compilefazy (innej fazy) do kompilowania kodu testowego (przez jego testCompilecel) w innym wykonaniu ( default-testCompile). Możesz także skompilować (używając tej samej wtyczki i celu) jakiś automatycznie wygenerowany kod w innej fazie, jak zdefiniowano w wykonaniu określonym w POM (i potencjalnie w innej konfiguracji).

Domyślne wykonania są dostarczane natychmiast po wyjęciu z pudełka za pośrednictwem powiązań pakowania Mavena , to znaczy domyślnie (i wymuszając konwencję nad konfiguracją) Maven już wywołuje określone cele (standardowych wtyczek) podczas niektórych faz. Identyfikatory wykonania tych domyślnych wywołań są zdefiniowane zgodnie z pewnymi konwencjami .

Wyjaśnia to również, dlaczego jeśli naprawdę chcesz przesłonić domyślne zachowanie (powiązanie) kompilacji Mavena, musisz określić (nadpisać) dokładnie ten sam identyfikator wykonania w swoim POM dla tej samej wtyczki. Możesz na przykład pominąć kompilację, po prostu definiując wykonanie operacji maven-compiler-plugino tym samym default-compileidentyfikatorze, ale związanej z nieistniejącą fazą (lub pustą).

Krótko mówiąc : wykonanie mówi Mavenowi, który cel (e) ma wykonać, z jaką konfiguracją w której fazie.

Niektóre wykonania są dostarczane domyślnie (domyślne powiązania), co wyjaśnia, dlaczego minimalny pom maven składający się z zaledwie 6 linii może już wiele zdziałać (kompilacja, testowanie, pakowanie itp.): Wykonywanie celów standardowych wtyczek w pewnych fazach: jest to konwencja ponad konfiguracja. Następnie poprzez pom.xmlkonfigurację możesz dodać rzeczy (wykonania) do kompilacji lub wpłynąć na zachowanie już skonfigurowanych wtyczek (w tym przypadku żadna executionssekcja, ale configurationwystarczyłaby).

Tak, możesz pominąć cykle kompilacji (i ich fazy) i bezpośrednio wywołać cele (wtyczek). Wyobraź sobie, co następuje:

mvn compiler:compile
mvn compiler:testCompile
mvn surefire:test
mvn jar:jar

(UWAGA: możesz również wywołać inline tylko w jednym połączeniu)

Tutaj kompilujemy kod aplikacji, kod testowy, wykonujemy testy i pakujemy: wyobraź sobie, jak byłoby to ręczne, podatne na błędy, powtarzalne i czasochłonne. Pomaga nam konwencja nad konfiguracją: Maven wprowadza cykle życia i fazy kompilacji . Domyślny cykl życia (bez nazwy, to znaczy domyślny) zapewnia szereg faz opartych na najlepszych praktykach i konwencjach (mantra Mavena).
Jeśli chcesz osiągnąć to samo, co powyżej, po prostu uruchom: mvn packagea program automatycznie skompiluje, przetestuje i spakuje Twój projekt. W jaki sposób? wywoływanie wtyczek. Oznacza to, że fazy to znaczący i konfigurowalny zestaw wykonań wtyczek (celów). Aby uczynić go jeszcze bardziej standardowym, dla każdej fazy Maven najpierw wywoła poprzednią fazę, więc np. Jeśli chcesz przetestować, będziesz pewien, że najpierw skompilujesz.

ps zauważ, że podczas określania kilku celów dla tego samego execution, nadal będziesz wyraźnie widzieć w dzienniku kompilacji dwa różne wykonania (z tym samym identyfikatorem) dla dwóch różnych celów (stąd wciąż unikalna krotka).

A_Di-Matteo
źródło
18

Podziękowania dla Sandeep Jindal i Premraj (stąd Jakie są cele i fazy Mavena i jaka jest między nimi różnica? ). Ich wyjaśnienie pomaga mi to zrozumieć.

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

W skrócie z linku, nie powinieneś próbować zrozumieć wszystkich trzech naraz, najpierw powinieneś zrozumieć relacje w tych grupach:

  • Cykl życia a faza
  • Wtyczka kontra cel

1. Cykl życia a faza

Cykl życia to zbiór faz w sekwencji, patrz tutaj Odniesienia do cyklu życia . Kiedy wywołujesz fazę , wywoła ona również wszystkie fazy przed nią.

Na przykład cykl życia czyszczenia obejmuje 3 fazy ( czyszczenie wstępne, czyszczenie, czyszczenie końcowe ).

mvn clean

Będzie wywołać czyszczenie wstępne i czyszczenie .

2. Wtyczka kontra cel

Goal 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 „wywołaj czysty cel w czystej wtyczce” (Nic nie ma związku z czystą fazą tutaj. Nie pozwól, aby słowo „czyste” Cię zmyliło, to nie to samo! Zobacz pełne wyjaśnienie w moim linku powyżej)

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

Faza może (wstępnie) łączyć się z celem (celami), na przykład normalnie czysta faza łączy się z czystym celem. Więc kiedy wywołasz to polecenie:

mvn clean

Nazywa fazę czyszczenia wstępnego i fazę czystą, która łączy się z celem czystym: czystym.

To prawie to samo, co:

mvn pre-clean clean:clean
Surasin Tancharoen
źródło
1
@ 2. & 3. IMHO, clean:cleannie jest najlepszym wyborem na przykład. Nazwane są 4 pozycje clean(cykl życia, faza, wtyczka, cel), które mogą być mylące, szczególnie dla początkujących (pamiętam, że na początku było dla mnie). @ 3. Czasownik „link” też nie jest dobrym wyborem, IMHO. Oficjalny termin Mavena to „ wiązać ”.
Gerold Broser
@GeroldBroser. Całkowicie zgadzam się z czystym: czystym. Wyjaśniłem i ostrzegłem to w moim pełnym wyjaśnieniu w linku. Skopiuję te ostrzeżenia również tutaj. Powód, dla którego go użyłem, ponieważ dobrze jest poinformować ludzi o tym mylącym słowie, a zwłaszcza o oficjalnym dokumencie maven, który go używa i to jasno to wyjaśnia. I tak, to też mnie zdezorientowało. W każdym razie bardzo dziękuję za komentarze
Surasin Tancharoen
literówka: oficjalny dokument
Maven
17

I z opóźnieniem kolejny diagram

  • Cykle życia jako żółte prostokąty
  • Fazy cykli życia jako niebieskie prostokąty z fazami „wywoływalnymi” w kolorze ciemnoniebieskim (tj. Fazy z łączeniem nie są zwykle wywoływane z wiersza poleceń, ponieważ mogą nie być zaprojektowane tak, aby pozostawić projekt w dobrze zdefiniowanym stanie).
  • Cele jak niebieskie tabletki do ssania. Pokazana asocjacja / powiązanie „faza -> cel” to tryb pakowania „słoika” . Każda faza może mieć powiązane cele. Dotyczy to oczywiście każdego cyklu życia, chociaż powiązania są wyświetlane tylko dla „domyślnego” cyklu życia.
  • Wtyczki jako szare przycięte prostokąty. Wtyczki zapewniają cele, które można powiązać z fazami.

Maven Lifecycles, Phases, Goals, Plugins

David Tonhofer
źródło
Plik graphml (edytowany za pomocą bezpłatnego edytora YEd) jest dostępny pod adresem github.com/dtonhofer/diagrams
David Tonhofer
1) Co dokładnie masz na myśli przez „ wywoływalne” fazy „, które są„ w ciemnoniebieskim ”? Każda faza Mavena jest „wywoływalna” (chociaż ja raczej nazywam ją wywoływalną , ponieważ nie ma kodu wywoływanego bezpośrednio przez wywołanie fazy). Czy może nazywasz fazy „ wywoływalne ”, które mają przypisany cel (domyślnie)? Nie jest prawdą, że nawet, jeśli spojrzeć validate, initializei verify.
Gerold Broser
2) resources:[testR|r]esourcesCel NIE jest powiązany z fazami process-sourceslub process-test-sourcesw jarcyklu życia .
Gerold Broser
3) modello:javaw Modello Plugin widocznie jest specyficzne dla domeny. Powiązanie celu wtyczki z fazą obowiązuje dla każdej z faz.
Gerold Broser
@GeroldBroser Naprawiono zgodnie z komentarzami. „Możliwość wywołania” oznacza, że ​​można go wywołać z wiersza poleceń i oczekiwać, że projekt pozostanie w prawidłowym stanie. Nie ma znaczącej różnicy między wzywaniem a wzywaniem, a wzywanie jest tym, czego używa Maven Wprowadzenie .
David Tonhofer
12

Źródło to jest naprawdę dobry tutorial

Cykle życia, fazy cyklu życia, wtyczki i cele wtyczek są rdzeniem Maven.

  • Polecenie Maven mvn może przyjąć jako argument tylko fazę cyklu życia lub cel wtyczki.
  • Maven ma trzy cykle życia - domyślny, czysty i witryna.
  • Każdy cykl życia składa się z faz cyklu życia i łącznie jest 28 faz - domyślnie 21 ( walidacja, ..., kompilacja, ..., pakiet, ..., instalacja, wdrażanie ), czyste 3 ( wstępne czyszczenie, czyste, po czyszczeniu ) i lokacja 4 ( przed lokacją, lokacja, po lokacji, wdrożenie w lokacji ).
  • gdy faza cyklu życia jest wywoływana za pomocą polecenia mvn, wszystkie poprzednie fazy są wykonywane sekwencyjnie jedna po drugiej.
  • Fazy ​​cyklu życia same w sobie nie mają żadnych możliwości wykonania jakiegoś zadania i polegają na wtyczkach do wykonania zadania.
  • w zależności od projektu i typu opakowania, Maven wiąże różne cele wtyczek z fazami cyklu życia, a cele realizują powierzone im zadanie.

Kiedy uruchamiamy „ pakiet mvn ” w projekcie Java, Maven wiąże cele wtyczki z fazami cyklu życia, jak pokazano na następnym rysunku.

mvn-plugins-package-goal

Erlan
źródło
1
Wspomniany materiał jest całkiem niezły. Dziękuję Ci!
William Kinaan
@ „ Polecenie Maven mvn może akceptować jako argument tylko fazę cyklu życia lub cel wtyczki. ” Nie jest poprawne. Akceptuje również opcje .
Gerold Broser
Kiedy uruchamiamy„ pakiet mvn ”w projekcie Java, Maven wiąże cele wtyczki z fazami cyklu życia ” nie jest prawdą. Wiązanie celu ma miejsce na długo przed uruchomieniem mvn ...: w default-bindings.xml lub w POM i nie jest wykonywane przez Mavena, ale przez człowieka.
Gerold Broser,
7

Więc wyjaśnij trochę dalej, jak opisano tutaj

Kompilacje Mavena są podzielone na cykle życia:

  • czysty
  • build (domyślny)
  • teren

Każdy z tych cykli jest podzielony na fazy. Na przykład kompilacja jest podzielona na fazy, takie jak:

  • przygotować zasoby
  • skompilować
  • pakiet
  • zainstalować

Fazy mają cele, aby uruchomić przed przed- lub po post- fazie, na przykład:

  • czyszczenie wstępne - zostanie wykonane przed fazą czyszczenia
  • post-clean - zostanie wykonany po fazie czyszczenia

Jeśli chcesz, możesz wyświetlić cele jako dodatkowe „wstawione” fazy. Przeczytaj tutaj lub spójrz na odpowiedź @Gerolds, aby uzyskać szczegółowe informacje.

Drejc
źródło
1
Ta odpowiedź nie jest poprawna w całości. Zobacz moją odpowiedź .
Gerold Broser
O rany, 3 lata odkąd odpowiedziałeś na to pytanie… i nadal nie odpuszczasz… wygrałeś… teraz idź dalej.
Drejc
Nie chodzi o wygrywanie. Czy nie zmieniasz starych pytań, odpowiedzi i komentarzy, jeśli później się na nie natkniesz?
Gerold Broser
3

LifeCycle vs Phases: Life Cycle to zbiór plikówphases . Kiedy wywołujesz fazę, wywoła ona również wszystkie fazy, które ją poprzedzają. Maven ma 3 wbudowane cykle życia kompilacji, takie jak:

  1. Czysty cykl życia - obejmuje czyszczenie projektu (dla nowej kompilacji i wdrożenia)
  2. Domyślny cykl życia / kompilacji - obsługuje pełne wdrożenie projektu
  3. Cykl życia witryny - obsługuje generowanie dokumentacji projektu w języku Java. wprowadź opis obrazu tutaj

Cykl czyszczenia obejmuje 3 fazy: czyszczenie wstępne, czyszczenie i czyszczenie końcowe. Fazy ​​domyślne i cykle życia witryny są takie same, jak pokazano na rysunku.

Arun Raaj
źródło
Twój ostatni akapit wprowadza w błąd. Zwłaszcza pierwsze i ostatnie zdanie. Cele i fazy to zupełnie inne rzeczy. Nie wolno ich mylić, ponieważ niektóre z nich mają identyczne nazwy. Do „ Cele to fazy, które widzisz na powyższym obrazku. ”: Nie ma ani jednego celu wymienionego na obrazku. To są wszystkie fazy . Re „ Piszesz nazwę fazy jako„ cel ”, kiedy musisz wykonać określony cel. ”: Chociaż możliwe jest jawne uruchomienie celu wtyczki, zwykłym sposobem jest wykonanie rozbudowy do określonej fazy za pomocą mvn <phase>. Zobacz moją odpowiedź tutaj.
Gerold Broser
Dzięki, usunąłem część „Wtyczka kontra cel”. Zaktualizuję to wkrótce.
Arun Raaj,