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ść
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
compile
fazie (niestety nie wspomniano)>
- Wywołuję wtyczkę Maven Compiler (
artifactId
i version
)>
- Przywołuję jego
compile
cel>
- zgodnie z
default-compile
wykonaniem
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-plugin
przykład jest również używany podczas test-compile
fazy (innej fazy) do kompilowania kodu testowego (przez jego testCompile
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 samym default-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 żadna executions
sekcja, ale configuration
wystarczył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 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).