Z Mavenem związanych jest kilka pojęć, które szczególnie na początku zniechęcają do szerszego poznania
tego niezwykle użytecznego narzędzia. Same nazwy takie jak fazy (phases) czy cele (goals) potrafią skutecznie odstraszać
przed dalszym zdobywaniem wiedzy w tym obszarze (całkiem niepotrzebnie). W bieżącym rozdziale postaramy się pokazać, że w gruncie rzeczy nie są to skomplikowane zagadnienia i łatwo się ich nauczyć.
Cykle życia (Lifecycles)
Cykl życia to przejście przez kolejne etapy (fazy) danego procesu od jego początku do samego końca.
W przypadku Mavena wyróżniamy trzy cykle życia:
- default - cykl życia od walidacji projektu, przez jego budowę i instalację w lokalnym repozytorium, aż do wysłania go na zdalne repozytorium
- clean - cykl życia począwszy od kroku poprzedzającego usuwanie katalogu target, przez jego faktyczne usunięcie, aż do wykonania kroku "po wyczyszczeniu"
- site - cykl życia zaczynający się od kroku poprzedzającego stworzenie strony, przez jej realne stworzenie, aż do wysłania gotowej strony na repozytorium
Pierwsze dwa, a więc
default i
clean są zdecydowanie najbardziej istotne,
a także najczęściej używane. Cykl
default zawiera wszystko, co ma związek z budowaniem paczki projektowej
(na przykład
jar), ale wcale na tym się nie kończy. Ostatnim jego etapem jest wysłanie paczki na zdalne repozytorium (deploy).
Cykl
clean zawiera kroki wymagane do usunięcia katalogu
target z poprzednio wygenerowanych
klas i zasobów, tak aby zrobić miejsce na nowe.
To ile etapów (faz) z cyklu życia zostanie wykonanych, zależy od nas. Warto jednak wiedzieć, że wszystkich etapów we wszystkich trzech cyklach życia mamy
sumarycznie aż 28!
Fazy (Phases)
Wspomniane 28 faz rozkłada się bardzo nierównomiernie. Zdecydowanie najwięcej znajdziemy ich w cyklu życia budowania i deploymentu (
default).
Zobaczmy teraz, jak to wygląda w praktyce:
- default - 21 faz
- clean - 3 fazy
- site - 4 fazy
Bardzo często jest tak, że cały cykl życia nie jest wykonywany. To ile kroków zostanie wykonanych, zależy od tego, jaką
fazę chcemy wywołać. Jak zatem wywołujemy fazę i jakie to niesie ze sobą konsekwencje?
Każdy, kto pracował z Mavenem, uruchamiał w swoim projekcie jakąś fazę i choć nie każdy zdaje sobie z tego sprawę, to wywołujemy ją tak:
Tak, to właśnie główna komenda
mvn używa faz. Uruchamiając fazę
package, wpisujemy po prostu:
Wtedy wykonują się po kolei wszystkie fazy w cyklu życia, które znajdują się przed fazą
package.
Patrzymy więc na zdjęcie cyklu życia, w którym znajduje się
package i już wiemy, że wykonają się kolejno wszystkie zaznaczone fazy:
Tak samo będzie w innych przypadkach, a więc i w przypadku powszechnie używanej fazy
clean:
Zaglądamy do cyklu życia, w którym znajduje się
clean i widzimy, że po uruchomieniu powyższej komendy, wykonają się w sumie dwie fazy:
Kilka faz z różnych cykli życia
Teraz coś, co większość programistów wykonuje na co dzień, a więc budowanie i instalacja artefaktu w lokalnym repozytorium
wraz z uprzednim usunięciem katalogu
target:
Jeśli mamy kilka faz występujących po sobie, wtedy wykonują się one po kolei od pierwszej wpisanej fazy (najpierw
clean, a potem
install).
Wykonywanie każdej fazy będzie natomiast wyglądało tak, jak pokazywaliśmy wcześniej. Zatem wykonają się kolejno:
Uruchomią się więc najpierw 2 fazy cyklu
clean, a następnie 20 faz cyklu
default.
Wtyczki (Plugins) i cele (Goals)
Wtyczki (pluginy) składają się z określonych zadań do wykonania. Można powiedzieć, że mają swoje cele do osiągnięcia.
Co ważne, słowo "cel" nie zostało tutaj użyte przypadkowo. Tak właśnie nazywane są owe zadania (z ang. goals).
Jak wywołujemy cel? Robimy to, wywołując komendę:
Na przykład:
Wygląda to znajomo prawda? Znowu mamy
install (jak w przypadku faz) i to nie dzieje się przypadkowo. Okazuje się, że
wywołanie fazy de facto wywołuje plugin z nazwą celu. Zatem jeśli wywołujemy fazę
mvn install,
wtedy Maven wywoła cel
install z pluginu
install!
Od razu nasuwa się pytanie. Skąd ja jako programista mam wiedzieć, które fazy wywołują dane pluginy i cele?
Można to bardzo łatwo sprawdzić. Wystarczy uruchomić komendę:
Przykładowo, aby wylistować wszystkie pluginy fazy
compile uruchamiamy:
Dostajemy wtedy od razu dwie informacje. Pierwsza dotyczy tego, jakiego pluginu i jakiego celu używa faza
compile.
Druga jest listą wszystkich faz cyklu życia, do którego należy faza
compile.
Jak widać, niektóre z faz nie mają domyślnie przypisanych pluginów. Możemy podpiąć je sami w pliku
pom.xml.
Podpięcie pluginu pod wybraną fazę
W poprzednim paragrafie pokazaliśmy, że domyślnie nie wszystkie fazy mają podpięte pluginy.
To jednak nie problem, ponieważ sami także możemy podpiąć plugin do konkretnej fazy.
W
pom.xml (
zobacz przykładowy pom.xml) dodajemy plugin w sekcji
build ->
plugins:
Plugin jest zdefiniowany za pomocą znanych tagów, takich jak
groupId,
artifactId i
version.
Dodatkowo zawiera sekcję
executions, gdzie określamy co, jak i kiedy ma się dokładnie uruchomić.
To tutaj podajemy nazwę
fazy i celu, w ramach których plugin ma zostać uruchomiony (
validate,
echo).
Konfiguracja zależy od tego, jak dany plugin jest skonstruowany. Korzystamy tutaj z pluginu
echo-maven-plugin, który przyjmuje zmienną konfiguracyjną
message.
W trakcie uruchomienia treść tej zmiennej zostanie wydrukowana na konsoli.
Oprócz tego zobaczymy tam również identyfikator pluginu.
W celu wyróżnienia wydruku nadaliśmy id z dodatkowymi znakami (#).
Efekt uruchomienia fazy
validate wygląda tak:
Na tę chwilę to wszystko, jednak w najbliższym czasie możecie spodziewać się tutaj więcej nowych treści.
Mapa umiejętności programisty Java
Nie jesteś biegły w Javie?
Interesuje Cię szerszy zakres wiedzy?