Maven dla początkujących – jak zbudować projekt

Ania Dobrowolska

1 października 2015

Java

2 komentarze

Maven to jedno z popularniejszych narzędzi automatyzujących proces budowania aplikacji napisanych w Javie. Służy między innymi do zarządzania projektem i dołączonymi bibliotekami. Szczególnie dla początkujących Maven może wydawać się skomplikowany. Narzędzie jest bardzo rozbudowane, dlatego przedstawię krok po kroku jak rozpocząć z nim pracę wykorzystując środowisko IntelliJ IDEA (w wersji 14.1.5) i omówię podstawowe funkcjonalności z których najczęściej korzystam.

Po co mi Maven?

Odpowiedź jest prosta, mały projekt – mały problem, duży projekt – duży problem. Zakładając, że nasza aplikacja będzie składała się z kilku klas zwykle nie myślimy o tym, że potrzebne jest nam narzędzie zarządzające strukturą projektu. Problem pojawi się w momencie, kiedy projekt zacznie się rozrastać, dołączą do współpracy inne osoby, o problemach z uruchamianiem w innych IDE nie wspominając… Nie jest to jedyne narzędzie z którego możemy skorzystać, podobne zastosowanie ma również Ant, czy Gradle.

Główne korzyści płynące z wykorzystania Mavena:

  • łatwo rozpocząć z nim pracę,
  • porządkuje biblioteki i strukturę projektu,
  • można korzystać z niego przy użyciu konsoli,
  • ma bardzo dobrą dokumentację,
  • posiada wygodne wtyczki do wielu IDE,
  • konfiguracja skupiona jest w pliku pom.xml (zawsze wiadomo gdzie jej szukać),
  • ma dużo zaawansowanych zastosowań, które można dodawać krok po kroku,
  • jest popularny – duża szansa, że osoby dołączające do zespołu będą go już znały.

Instalacja

Na początku trzeba pobrać narzędzie ze strony głównej projektu Apache Maven Project. Wersja “binary” jest gotowa do użytku, nie wymaga instalacji, wystarczy rozpakować w wybranym miejscu.

Po uruchomieniu IDE wybieramy File -> Other Settings -> Default Settings…, odszukujemy zakładkę Maven, a następnie podajemy ścieżkę do rozpakowanego programu. Opcjonalnie możemy ustalić też ścieżkę do pliku z ustawieniami Mavena oraz ścieżkę do katalogu w którym będzie utworzone repozytorium. Do katalogu repozytorium będą pobierane biblioteki z których korzystamy w projektach. Odruchowo zaznaczam też opcję Always update snapshots. Snapshot to oznaczenie wersji biblioteki, która jest nadal rozwijana i nie została jeszcze wydana – spodziewam się w niej ciągłych zmian i chce żeby była aktualizowana na bieżąco.

Maven - domyślne ustawienia

W sekcji Importing zwykle mam zaznaczone dodatkowo Import Maven projects automatically, dzięki temu projekt jest odświeżany w momencie zmian w pliku konfiguracyjnym pom.xml, o którym napiszę więcej w dalszej części wpisu. Przydatne jest również zaznaczenie automatycznego pobierania źródeł i dokumentacji bibliotek.

Maven - domyślne ustawienia - importowanie

Tworzenie aplikacji Maven dla początkujących

Na początek proponuję stworzyć projektu typu Maven na podstawie archetypu org.apache.maven.archetypes:maven-archetype-quickstart. Zawsze myślę o archetypach jako o szablonach projektów, dzięki nim szybko można wygenerować podstawową strukturę. Wspomniany archetyp utworzy aplikację wyświetlającą “Hello World!”.

Maven - nowy projekt

Na kolejnym ekranie należy podać:

  • groupId
    Identyfikuje projekt wśród innych projektów.
  • artifactId
    Nazwa modułu, w tym przykładzie jest tylko jeden moduł.
  • version
    Numer wersji. W tym miejscu może pojawić się dodatkowo oznaczenie -SNAPSHOT, jeśli wersja jest jeszcze rozwijana.

Para groupId i artifactId powinna być unikalna. Na kolejnych ekranach zatwierdzamy wcześniej skonfigurowane ustawienia Mavena i wybieramy nazwę projektu.

Struktura projektu

Wygenerowana aplikacja ma strukturę charakterystyczną dla projektów opartych na Mavenie:

  • src/main/java
    Przechowuje pliki źródłowe aplikacji.
  • src/test/java
    Zawiera pliki z testami.
  • pom.xml
    Plik konfiguracyjny Mavena.

W miarę rozbudowy projektu należy utrzymywać zgodność struktury z dokumentacją. Pliki w katalogu .idea oraz pliki *.iml są generowane przez IDE.

Główny plik konfiguracyjny – pom.xml

Maven wykorzystuje informację z pliku pom.xml (Project Object Model) do budowania projektu. Plik zawiera tag project, w którym obowiązkowo muszą znaleźć się tagi modelVersion o wartości 4.0.0 (aktualnie wspierana wersja), groupId, artifactId, version. W wygenerowanym pliku widzimy dodatkowe, opcjonalne tagi:

  • packaging
    Określa co ma zostać zbudowane, w tym przypadku plik jar. Jeśli stworzymy aplikację webową będzie to war.
  • name
    Nazwa projektu.
  • url
    Adres strony projektu.
  • properties
    Miejsce na wartości, których możemy używać w innych miejscach pliku pom.xml za pomocą ${nazwa_ustawienia}. Zapobiega duplikowaniu tych samych wartości.
  • dependencies
    Zależności, czyli biblioteki których używamy w projekcie, więcej o nich w dalszej części artykułu.

Zależności

W pliku pom.xml wewnątrz tagu dependencies deklarujemy jakich bibliotek chcemy użyć w danym module. Domyślnie mamy do dyspozycji biblioteki z repozytorium Mavena. Strona główna repozytorium udostępnia wygodną wyszukiwarkę, dzięki której możemy odnaleźć interesującą nas bibliotekę. Możemy również dodać do konfiguracji Mavena dowolne inne repozytorium (przykładowo firmowe). Każdy artefakt, który chcemy dołączyć musi być opisany poprzez groupId, artifactId oraz numer wersji. Dołączony w przykładzie JUnit umożliwia wykonywanie testów jednostkowych. Podając wartość scope ustalamy w jakim zakresie ma być dostępny. Artefakty mogą być dostępne w zasięgach:

  • compile
    Jest to domyślny zasięg. Pliki będą dołączone do aplikacji (wkompilowane w nią), są zawsze dostępne.
  • provided
    Biblioteki będzie można wykorzystać podczas pisania kodu, do kompilacji i testów, ale nie zostaną dołączone do wynikowego pliku. Ten zasięg zakłada, że inne źródła dostarczą artefakty w czasie wykonania programu. Przykładowo serwer aplikacji ma wbudowane pewne biblioteki, więc nie ma potrzeby dołączać ich do aplikacji, jednak do skompilowania projektu są niezbędne.
  • runtime
    Czasami jest potrzeba użycia artefaktu tylko podczas testów oraz w czasie wykonania programu. Dobrym przykładem są sterowniki do bazy danych – JDBC.
  • test
    Biblioteki dostępne podczas kompilacji i uruchamiania testów.
  • system
    Zasięg podobny do provided, jednak umożliwia wybranie pliku z dysku twardego zamiast z repozytorium.

Cykl życia

Jest to najważniejsza idea, na której opiera się Maven. Definiuje proces budowania i dystrybucji projektów. Istnieją trzy wbudowane cykle życia:

  • default
    Odpowiada za zbudowanie (i wdrożenie) projektu.
  • clean
    Czyści projekt, usuwa stare, niepotrzebne pliki.
  • site
    Generuje stronę z dokumentacją projektu.

Domyślny cykl życia w uproszczeniu zawiera kilka faz:

  1. validate
    Sprawdzenie czy kod jest poprawny i czy projekt zawiera wszystkie niezbędne informacje np. odpowiednie zależności. Jeśli używamy jakiejś biblioteki, musimy ją zadeklarować w pliku pom.xml, w innym przypadku ta faza zakończy się błędem i proces budowania zostanie przerwany.
  2. compile
    Podczas tej fazy kompilowany jest kod źródłowy projektu.
  3. test
    Skompilowany kod jest poddawany testom jednostkowym wykorzystując dołączone biblioteki do testów.
  4. package
    Tworzony jest wynikowy plik, w omawianym przykładzie będzie to jar.
  5. integration-test
    Spakowany kod poddawany jest testom integracyjnym. Jeśli testy tego wymagają to paczka wdrażana jest na specjalne środowisko, umożliwiające uruchomienie testów.
  6. verify
    Sprawdzana jest poprawność utworzonego artefaktu.
  7. install
    Artefakt jest instalowany w lokalnym repozytorium. Dzięki temu można go wykorzystać go jako zależność w innym projekcie.
  8. deploy
    Wdrożenie artefaktu, przykładowo na serwer aplikacji, czy do zdalnego repozytorium.

Uruchamianie

Za pierwszym razem musimy określić w jaki sposób będziemy uruchamiać nasz projekt:

  1. Z głównego menu wybieramy Run -> Edit Configuration, a następnie zielony plusik i Maven.
  2. Nadajemy nazwę konfiguracji.
  3. W parametrach upewniamy się, że Working directory zawiera ścieżkę do naszego modułu
  4. Command line wpisujemy wybraną fazę. Wszystkie kroki z cyklu życia zostaną wykonane, aż do wskazanej fazy. Przykładowo wpisując install, wykonają się przedstawione powyżej fazy oprócz ostatniej – deploy. Dobrą praktyką jest czyszczenie projektu przed ponownym budowaniem, dlatego zwykle używam clean install (fazy oddzielamy spacjami, bez przecinków).
  5. Po skonfigurowaniu wybieramy OK.
  6. Uruchamiamy wybierając z głównego menu Run -> Run… -> NazwaKonfiguracji (polecam wygodny skrót Alt + Shift + F10 – > NazwaKonfiguracji).

Maven wyczyści projekt, pobierze wymagane zależności (w tym przypadku JUnit), zbuduje nam projekt i wykona test jednostkowy. Po pierwszym uruchomieniu pojawi się dodatkowy folder target, w którym znajdziemy wynikowy artefakt. Kolejne uruchomienia to po prostu wykonanie kroku 6.

Podsumowanie

Rozpoczęcie pracy z Mavenem jest bardzo proste, także dla początkujących programistów. Nawet przy niewielkich projektach można dzięki niemu zautomatyzować część czynności. Przykładowo czyszczenie projektu, zbudowanie paczki, wykonanie testów i uruchomienie możemy wykonać zamieniając clean install na:

W parametrze powinna znaleźć się ścieżka do klasy którą chcemy uruchomić. Oczywiście nie jest to jedyna metoda uruchamiania, ale dobra na początek – prosta i szybka w użyciu oraz przykład wykorzystania pluginu. Pluginy w znaczący sposób rozszerzają funkcje Mavena, więc jest to temat na oddzielny wpis.

Related Posts

Confitura 2016

W tym roku odbyła się jubileuszowa 10 edycja Confitury. Konferencję mogę szczerze polecić każdemu kto chce być na bieżąco z technologiami związanymi z JVM. Wykłady były na bardzo dobrym poziomie. Jak co roku poznałam kilka nowych osób i spotkałam znajomych, z którymi widuję się tylko na branżowych konferencjach. Luźna atmosfera pozwoliła na rozmowę z prelegentami.

Read More

PJUG Kraków – Java 9 i JUnit 5

Na kolejnym meetupie Polish Java User Group w Krakowie same nowości – Java 9 i JUnit 5. Coraz więcej wiadomo o Javie 9 – tym razem można było zobaczyć przykłady kodu korzystającego z JDK 9 Early Access Release. Na drugim wykładzie dowiedziałam się jak będzie wyglądała nachodząca wersja jednej z najpopularniejszych bibliotek do testowania – JUnit.

Read More

2 komentarze

  • Agnieszka on 15 października 2015

    Spoko to wygląda 🙂 Jasno opisane i nawet już coś rozumiem 😉
    Ale przydałoby się więcej o samym pomie, dla mnie to jest najbardziej niezrozumiałe, pewnie dlatego, ża za dużo opcji itp. mogłabyś też np. pokazać, jak radzić sobie z najczęstrzymi błędami i co jest ich przyczyną.

    • Ania Dobrowolska on 15 października 2015

      Dzięki, chciałam przedstawić minimum dobre na początek 🙂 Planuję omówić w kolejnym wpisie dziedziczenie pomów, tworzenie modułów i kilka pluginów, których najczęściej używam. Postaram się też dodać parę słów jak można radzić sobie z błędami.

Dodaj komentarz

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