Kurs Java

Maven - Cykle życia, fazy i cele

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:
mvn <NAZWA FAZY>
Tak, to właśnie główna komenda mvn używa faz. Uruchamiając fazę package, wpisujemy po prostu:
mvn package
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:
mvn 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:
mvn clean install
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ę:
mvn <NAZWA PLUGINU>:<NAZWA CELU>
Na przykład:
mvn install:install
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!
mvn <NAZWA FAZY>   -------->     mvn <NAZWA PLUGINU>:<NAZWA CELU>
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ę:
mvn help:describe -Dcmd=<NAZWA FAZY> 
Przykładowo, aby wylistować wszystkie pluginy fazy compile uruchamiamy:
mvn help:describe -Dcmd=compile
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:
<build>
    <plugins>
        <plugin>
            <groupId>com.github.ekryd.echo-maven-plugin</groupId>
            <artifactId>echo-maven-plugin</artifactId>
            <version>1.2.0</version>
            <executions>
                <execution>
                    <id>######################  VALIDATE  ######################</id>
                    <phase>validate</phase>
                    <goals>
                        <goal>echo</goal>
                    </goals>
                    <configuration>
                        <message>In 'validate'</message>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
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

Stale się rozwijamy, a więc bądź na bieżąco!
Na ten adres będziemy przesyłać informacje o ważniejszych aktualizacjach, a także o nowych materiałach pojawiających się na stronie.
Polub nas na Facebooku:
Nasi partnerzy: stackshare
Javappa to również profesjonalne usługi programistyczne oparte o technologie JAVA. Jeśli chesz nawiązać z nami kontakt w celu uzyskania doradztwa bądź stworzenia aplikacji webowej powinieneś poznać nasze doświadczenia.
Kliknij O nas .


Pozycjonowanie stron: Grupa TENSE