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!
maven
maven-3
pom.xml
maven-lifecycle
Jeff Levine
źródło
źródło
Odpowiedzi:
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) nazywane są fazami 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
mvn
bez żadnej fazy lub celu [z przerwami między wierszami i skróconymi dla czytelności tutaj]:Bibliografia:
Jeśli kiedykolwiek zastanawiałeś się, skąd Maven wie, co robić bez wiązania celu w POM,
default-bindings.xml
na 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.xml
niedostatecznie.../<component>/<role>org.apache.maven.lifecycle.Lifecycle
.źródło
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ść
I rzeczywiście w ten sposób Maven pokazuje to (najmniejszą jednostkę pracy) za pomocą unikalnego ciągu w dzienniku kompilacji:
Na przykład mielibyśmy:
Co w istocie oznacza (poprzez różne poziomy szczegółowości):
compile
fazie (niestety nie wspomniano)>artifactId
iversion
)>compile
cel>default-compile
wykonaniemJest 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-plugin
przykład jest również używany podczastest-compile
fazy (innej fazy) do kompilowania kodu testowego (przez jegotestCompile
cel) 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-plugin
o tym samymdefault-compile
identyfikatorze, 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.xml
konfigurację możesz dodać rzeczy (wykonania) do kompilacji lub wpłynąć na zachowanie już skonfigurowanych wtyczek (w tym przypadku żadnaexecutions
sekcja, aleconfiguration
wystarczyłaby).Tak, możesz pominąć cykle kompilacji (i ich fazy) i bezpośrednio wywołać cele (wtyczek). Wyobraź sobie, co następuje:
(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 package
a 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).źródło
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:
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 ).
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:
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:
Nazywa fazę czyszczenia wstępnego i fazę czystą, która łączy się z celem czystym: czystym.
To prawie to samo, co:
źródło
clean:clean
nie jest najlepszym wyborem na przykład. Nazwane są 4 pozycjeclean
(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ć ”.I z opóźnieniem kolejny diagram
źródło
validate
,initialize
iverify
.resources:[testR|r]esources
Cel NIE jest powiązany z fazamiprocess-sources
lubprocess-test-sources
wjar
cyklu życia .modello:java
w Modello Plugin widocznie jest specyficzne dla domeny. Powiązanie celu wtyczki z fazą obowiązuje dla każdej z faz.Źródło to jest naprawdę dobry tutorial
Cykle życia, fazy cyklu życia, wtyczki i cele wtyczek są rdzeniem Maven.
Kiedy uruchamiamy „ pakiet mvn ” w projekcie Java, Maven wiąże cele wtyczki z fazami cyklu życia, jak pokazano na następnym rysunku.
źródło
mvn ...
: w default-bindings.xml lub w POM i nie jest wykonywane przez Mavena, ale przez człowieka.Więc wyjaśnij trochę dalej, jak opisano tutaj
Kompilacje Mavena są podzielone na cykle życia:
Każdy z tych cykli jest podzielony na fazy. Na przykład kompilacja jest podzielona na fazy, takie jak:
Fazy mają cele, aby uruchomić przed przed- lub po post- fazie, na przykład:
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.
źródło
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: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.
źródło
mvn <phase>
. Zobacz moją odpowiedź tutaj.