Zakładam, że każdy z nas korzystał kiedyś z narzędzi automatyzujący budowanie aplikacji takich jak Ant, Gradle czy właśnie Maven. W tym artykule chciałbym się skupić na tym ostatnim produkcie. Sam muszę przyznać, że korzystałem od dłuższego czasu z Mavena, ale dosyć nieświadomie. Nie zdawałem sobie sprawy jakie to jest potężne narzędzie aż do niedawna, kiedy postanowiłem, że przełamię ten impas i dowiem się czegoś więcej o nim. Wiem, że należy świadomie korzystać z rzeczy, które wykorzystuje się w pracy, więc pora nadrobić ten czas. Z tego powodu zapraszam Cię do weryfikacji razem ze mną czym tak naprawdę jest Maven.

Krótki opis Mavena

W Internecie możemy znaleźć ciekawostkę, która mówi, że maven w języku jidysz oznacza eksperta, speca. Według mnie to bardzo chwytliwa nazwa i przy okazji dodaje powagi jeśli ktoś zna to ukryte znaczenie. Po tej dygresji przejdźmy do zapoznania się z krótkim opisem powstania Mavena jaki znalazłem na stronie twórców. Oczywiście jest on w języku angielski, dlatego pozwoliłem sobie na swobodne tłumaczenie.

Inicjatywą, która stała za powstaniem Mavena, było uproszczenie procesów budowania aplikacji opartych o projekt Jakarta Turbine. Problemem w nich było to, że tworzone oprogramowanie składało się z osobnych projektów, które posiadały swoje osobne pliki budowania Ant kompletnie różniące się od siebie. Brakowało im jakiegokolwiek schematu powstawania. Po zbudowaniu aplikacji powstałe pliki JAR musiały być umiejscawiane ręcznie w repozytorium CVS. Twórcy Mavena uznali, że tak nie może być i chcieli ustandaryzować sposób w jaki powinny być budowane projekty. Głównymi ideami były: prosta definicja z czego ma się składać projekt, łatwy sposób publikowania informacji o projekcie, bezproblemowe dzielenie się plikami JAR pomiędzy projektami. W rezultacie powstało naprawdę użyteczne narzędzie, które pozwala na zarządzanie i budowanie aplikacji opartych na Javie w bardzo przystępny sposób.

Maven musiał sobie poradzić z kilkoma problematycznymi obszarami:

  • sprawienie, aby proces budowania był naprawdę prosty
  • dostarczenie ujednoliconego systemu budowania
  • przedstawienie naprawdę wartościowych informacji o projekcie
  • zachęcenie deweloperów do stosowania lepszych praktyk programowania

Rozpoczęcie pracy z Mavenem

W celu rozpoczęcia pracy z Mavenem na Windowsie najlepiej pobrać dedykowany plik binarny. W chwili pisania tego artykułu Maven znajduje się w wersji 3.8.3. Oczywiście konieczne jest posiadanie JDK w wersji co najmniej 1.7 (tyczy się to Mavena w wersji 3.3 lub wyższej). Gdy już rozpakujemy pobrany katalog to powinniśmy go umieścić w docelowym miejscu na dysku. Jest to niezbędne, aby utworzyć zmienną środowiskową systemu pozwalającą na uruchamianie Mavena z konsoli.

Ustawienie zmiennej środowiskowej do Mavena
Ustawienie zmiennej środowiskowej do Mavena

Teraz, gdy uruchomimy dowolny wiersz poleceń i wpiszemy mvn --version to przekonamy się czy Maven został poprawnie zainstalowany. Powinniśmy dostać informację o wersji tak jak poniżej.

Weryfikujemy czy Maven został poprawnie zainstalowany
Weryfikujemy czy Maven został poprawnie zainstalowany

Tworzenie pierwszego projektu wykorzystującego Maven

Z użyciem konsoli

Jednym ze sposobów utworzenia projektu zarządzanego przez Maven jest wykorzystanie archetypów. Czym są archetypy? W skrócie są to takie szablony projektów, które ktoś wcześniej za nas zdefiniował, oczywiście w oparciu o dobre praktyki. Możliwe jest również stworzenie własnego archetypu, aby ustandaryzować rozpoczynane przez nas projekty w obrębie organizacji. Ale przejdźmy do rzeczy, samouczek Mavena proponuje nam wykorzystanie takiej komendy.

1
mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4 -DinteractiveMode=false

Sugerowane jest zmienienie parametrów groupId oraz artifactId na własne wartości jak np. pl.devcezz i maven-archetype-demo. To co tutaj się zadziało to nic innego jak uruchomienie goal Mavena. Nie będę tłumaczył tego na cel, bo to strasznie głupio brzmi. No dobrze, ale czym w takim razie jest goal? Później sobie wyjaśnimy tą kwestię. Na razie przyjmijmy, że to pojedyncze zadanie udostępnione przez plugin Mavena.

Jeżeli uruchomimy wyżej przedstawioną komendę to po chwili uzyskamy dostęp do nowo utworzonego projektu. Będzie znajdował się w nim plik pom.xml oraz klasa App wraz z klasą testową do niej AppTest. Domyślnie użyta została siódma wersja Javy, zależność do jUnit w wersji 4.11 oraz masa pluginów Mavena.

Prawidłowo utworzony projekt z wykorzystaniem archetypu Maven
Prawidłowo utworzony projekt z wykorzystaniem archetypu Maven

Struktura wygenerowanego projektu
Struktura wygenerowanego projektu

Teraz uruchommy naszą aplikację. Aby tego dokonać najlepiej jak wygenerujemy plik jar. Robimy to wykorzystując komendę w wierszu poleceń mvn package. W porównaniu z wcześniejszym poleceniem to nie jest goal tylko phase, który jest trochę wyżej w hierarchii. Składa się on z kilku goal, ale to również opiszę później. Po wywołaniu tej komendy powinniśmy dostać taką wiadomość.

...
[INFO] Building jar: D:\git\my-app\target\my-app-1.0-SNAPSHOT.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  3.728 s
[INFO] Finished at: 2021-10-16T23:17:02+02:00
[INFO] ------------------------------------------------------------------------

Teraz tylko pozostało nam wywołać odpowiednią komendę uruchamiającą plik jar. Dokonujemy tego poprzez jego wskazanie oraz głównej klasy aplikacji.

1
java -cp target/my-app-1.0-SNAPSHOT.jar com.mycompany.app.App

Naszym oczom powinien ukazać się znany wszystkim komunikat: Hello World!. Przy tym instruktażu korzystałem z Javy w wersji 16.

Z użyciem IDE - Intellij

W Intellij również możemy skorzystać z archetypów, jednak jest z tym pewien problem… Lista dostępnych opcji podczas tworzenia nowego projektu Maven nie chce się załadować. Cały czas dostajemy komunikat ‘Loading archetype list…‘. No coż… Jest na to jeden sposób. Musimy wejść w ustawienia Settings -> Build, Execution. Deployment -> Build Tools -> Maven -> Importing i dodać parametr do maszyny wirtualnej -Xmx1024m albo -Xmx2048m. Oczywiście musimy zrestartować IDE. Od teraz lista archetypów powinna się załadować, ale podaje ten sposób bardziej jako ciekawostkę.

Problem ładowania się archetypów Mavena w IntelliJ
Problem ładowania się archetypów Mavena w IntelliJ

Lepiej jest po prostu kliknąć dalej i przejść przez kreator tworzenia pustego projektu zawierającego jedynie strukturę katalogów i plik pom.xml, który jest sercem Mavena. O nim opowiemy sobie mówić później. Na razie chcę Ci przekazać sposoby na wykreowanie projektu opartego o Mavena.

Z wykorzystaniem Spring Initalizr

W tym scenariuszu po prostu tworzymy aplikację opartą o Springa, ale wykorzystującą Mavena jako narzędzie do budowania projektu. Jeśli jesteśmy posiadaczami IntelliJ w wersji Ultimate to mamy możliwość wybrania Spring Initializr z poziomu okna dodawania nowego projektu. Jeżeli natomiast w zupełności wystarcza nam Intellij Community to musimy wybrać się na stronę start.spring.io.

Tworzenie projektu Spring Boot w oparciu o Maven - start.spring.io Tworzenie projektu Spring Boot w oparciu o Maven - start.spring.io

Tworzenie projektu Spring Boot w oparciu o Maven - IntelliJ Tworzenie projektu Spring Boot w oparciu o Maven - IntelliJ

Podsumowanie

W tym artykule to by było na tyle. Następną rzeczą jaką weźmiemy na tapet będzie rozebranie Mavena na części pierwsze. Sprawdzimy z jakich cykli życia on się składa i co znajduje się w każdym z nich, czyli czym są wcześniej wspomniane phases, goals oraz nadrzędne lifecycles. Zdradzając rąbka tajemnicy to w jeszcze późniejszym wpisie wejdziemy do wnętrza pliku pom.xml, który jest głównym elementem tej całej układanki. Także zapraszam Cię do kolejnych części!