Na co komu Maven?

Mój zalążek projektu kompiluję i buduję przy użyciu Mavena. Maven (ang. „spec”) to narzędzie do budowania projektów napisanych w Javie. Sam Maven także został napisany w tym języku. Maven pozwala w uporządkowany sposób zarządzać zagadnieniami takimi jak: kompilacja, testowanie, budowanie, wynajdowanie i pobieranie zależności, generowanie dokumentacji.

Po co mi Maven, skoro mogę zbudować projekt w moim IDE? Po pierwsze, IDE nie zawsze jest pod ręką i może nagle okazać się, że na komputerze kolegi nie da się zbudować pilnie poprawionej wersji kodu, gdyż brakuje pięciu bibliotek (a po ich pobraniu – pięciu kolejnych, wymaganych przez te pierwsze). Po drugie, jeśli kod ma być testowany, a nawet wdrażany automatycznie, to przecież potrzebna jest możliwość uruchomienia go z zewnątrz. Po trzecie wreszcie – Maven to cała masa udogodnień i gotowych rozwiązań.

Konfigurację projektu mavenowego umieszcza się w pliku pom.xml. Plik ten można napisać samemu, ale najczęściej jest on generowany przez jakiś inicjalizator. W moim wypadku był to wspomniany już wcześniej Spring Initializr, ale najczęściej szablon generuje sam Maven w oparciu o żądany „archetyp”. Poniższe wywołanie stworzy szkielet aplikacji webowej z odpowiednio zainicjalizowanym plikiem pom.xml:

Powstaje w ten sposób następująca struktura:

Wygląda znajomo?

Plik pom.xml mojego projektu wygląda tak:

Co oznaczają poszczególne elementy?

  • project: obowiązkowy znacznik najwyższego poziomu.
  • modelVersion: informacja o tym, z jakiego modelu DOM (Document Object Model) korzysta dany pom.xml. DOM w Mavenie zmienia się bardzo rzadko.
  • groupId: unikatowy identyfikator organizacji bądź grupy, która stworzyła projekt; najlepiej oparty o URL.
  • artifactId: nazwa głównego artefaktu generowanego przez projekt.
  • packaging: rodzaj wynikowego archiwum (e.g. JAR, WAR, EAR, etc.).
  • version: wersja powstałego artefaktu. SNAPSHOT oznacza wersję roboczą, do której się nie przywiązujemy.
  • name: wyświetlana (np. w dokumentacji) nazwa projektu.
  • description: krótki opis projektu
  • parent: (nieobowiązkowy) nadrzędny pom.xml, w którym zawarte są różne domyślne ustawienia projektu (np. kodowanie, konfiguracja pluginów).
  • properties: właściwości projektu. Ja podaję kodowanie źródeł oraz wersję Javy.
  • dependencies: zależności, czyli biblioteki potrzebne do zbudowania projektu. Jeśli nie ma ich na dysku, zostaną pobrane z repozytorium Mavena. Oprócz id grupy i artefaktu najczęściej trzeba podać także wersję, ale w tym wypadku wersjami podstawowych bibliotek zarządza wspomniany przed chwilą rodzic.
  • build: tu można zdefiniować podstawowe informacje na temat procesu budowania, np. lokalizację zasobów, profile budowania, niezbędne pluginy i ich konfiguracja. Pluginy w Mavenie mogą wszystko: potrafią przeprowadzić statyczną analizę kodu, przeformatować pliki itp. Moja aplikacja korzysta w tej chwili z pluginu Spring Boot Maven plugin, który umożliwia tworzenie uruchamialnych plików z aplikacją webową

Gdzie Maven przechowuje biblioteki?
Jeśli w systemie brakuje wymaganych bibliotek, Maven pobiera je ze zdalnego repozytorium http://mvnrepository.com lub innych wskazanych repozytoriówi umieszcza w repozytorium lokalnym.

Domyślna lokalizacja lokalnego repozytorium Mavena w systemie Windows
Domyślna lokalizacja lokalnego repozytorium Mavena w systemie Windows

Oto najważniejsze standardowe polecenia Mavena (kolejność nie jest przypadkowa):

  • validate: sprawdź, czy projekt jest skonfigurowany w sposób umożliwiający jego zbudowanie.
  • compile: skompiluj kod, jeśli zmienił się od poprzedniego razu
  • test: przetestuj kod (testy jednostkowe, niewymagające wdrożenia).
  • package: w oparciu o skompilowany kod utwórz wynikowe archiwum (np. JAR czy WAR).
  • integration-test: przeprowadź testy integracyjne (może obejmować wdrożenie).
  • verify: sprawdź jakość wynikowego archiwum.
  • install: zainstaluj archiwum w lokalnym repozytorium Mavena. Projekt stanie się wówczas dostępny jako zależność dla innych projektów.
  • deploy: wdróż!
  • clean: usuń wszystkie artefakty wygenerowane przez poprzednie buildy.
  • site: wygeneruj dokumentację (HTML w oparciu o Javadoc).

Jak to wygląda w moim projekcie? W oparciu o pom.xml powstanie plik szafbook-0.0.1-SNAPSHOT.jar. Mogę go uruchomić w konsoli – zawiera wbudowany serwer Tomcata, na którym odpali się moja aplikacja.

console
Maven w konsoli

Mavena można podpiąć pod wszystkie najważniejsze IDE. W Eclipse będzie to wyglądało tak:

Maven zintegrowany z Eclipse
Maven zintegrowany z Eclipse

W kolejnym wpisie postaram się odpowiedzieć (sobie) na pytanie, czy w przypadku mojego projektu warto porzucić Mavena na rzecz coraz popularniejszego systemu budowania Gradle.

Bonus: troubleshooting. Gdzie mój pom.xml?!  Eclipse domyślnie wyświetla pom.xml w postaci formularza. Poniższa ilustracja pokazuje, gdzie kliknąć, żeby dostać się do wersji tekstowej.

Przejście do wersji tekstowej w Eclipse
Przejście do wersji tekstowej w Eclipse

Komentarze

4 myśli nt. „Na co komu Maven?”

  1. Cześć 😉 Trafiłem przypadkiem i proszę, też ktoś z daj się poznać 🙂 A w temacie wpisu, mam dziwne wrażenie, że eclipse ma ciągłe problemy z mavenem. Przy dużym projekcie w którym pracowałem co jakiś czas trzeba było maven:install. Nie znalazłem przyczyny, ponieważ wolałem zająć się problemami projektowymi, w związku z czym przesiadka na Intellij, który robi to co do niego należy i nie stwarza dodatkowych problemów środowiskowych 😉 I można zająć się mięskiem 😉 Pozdrawiam!

      1. Intellij jest dużo przyjemniejsze i żwawsze od Eclipse – w moim odczuciu.
        Zacząłem od niedawna przygodę z testami automatycznymi i wsiąkam w Intellij + Maven 🙂

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *