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:
1 2 3 4 |
mvn archetype:create -DgroupId=[your project's group id] -DartifactId=[your project's artifact id] -DarchetypeArtifactId=maven-archetype-webapp |
Powstaje w ten sposób następująca struktura:
1 2 3 4 5 6 7 8 9 |
|-- src | `-- main | `-- java | |-- resources | |-- webapp | | `-- WEB-INF | | `-- web.xml | `-- index.jsp `-- pom.xml |
Wygląda znajomo?
Plik pom.xml mojego projektu wygląda tak:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>pl.namiekko</groupId> <artifactId>szafbook</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>szafbook</name> <description>Social Wardrobe Manager</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.3.3.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-rest</artifactId> </dependency> ... </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project> |
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 projektuparent
: (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.

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 razutest
: 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.
1 2 |
mvn package java -jar target/szafbook-0.0.1-SNAPSHOT.jar |
Mavena można podpiąć pod wszystkie najważniejsze IDE. W Eclipse będzie to wyglądało tak:

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.

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!
Cześć, jak miło! 🙂 Kolejny głos za Intellij. Muszę wypróbować.
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 🙂
Nawróciłam się już.
To teraz do kościółka pomodlić się za mamusię i tatusia.