We wcześniejszych lekcjach poznaliśmy Mavena jako narzędzie, dzisiaj dowiemy się nieco więcej jak skonfigurować i używać go w Eclipse.
Dzisiejsza lekcja powstała na prośbę jednego z naszych czytelników i omawiać będzie szerzej zagadnienia związane z konfiguracją i używaniem Maven w Eclipse.
Lekcja
Instalacja i wymagania
Aby w ogóle korzystać z Maven w środowisku Eclipse musimy najpierw pobrać odpowiednią wtyczkę. Nazywa się ona m2e i jest dostępna także poprzez Eclipse Marketplace. Najprawdopodobniej będziesz miała ją już zainstalowaną, jeśli pobierałaś wersje Eclipse przeznaczoną do web developmentu — np. SpringToolSuite. Jeśli nie, najłatwiej skorzystać z Eclipse Marketplace tak jak poniżej:
Zarządzanie projektem Maven pod Eclipse
Są trzy możliwości, jak możemy korzystać z dobrodziejstw m2e — polecam wykorzystywać wyłącznie dwie pierwsze, trzecia zostanie jedynie wspomniana i jest przeznaczona raczej dla osób doświadczonych z ‘grzebaniem’ w Eclipse.
Utwórz nowy projekt / moduł
Ta opcja jest dla osób, które dopiero będą pisały kod i chcą, aby projekt był zarządzany za pomocą Maven’a . Z menu File wybieramy opcję New a następnie Other. W oknie, które się pojawi wyszukujemy zakładkę ‘Maven’ i mamy dostępne kilka opcji:
Pierwsza z nich (Check out Maven Projects from SCM) umożliwia import projektu pobierając go z repozytorium (jak np. Git czy Svn — o nich powiemy sobie w przyszłości). Działa analogicznie jak importowanie istniejącego projektu (opisanego poniżej) tyle tylko, że sama pobiera kod z repozytorium na dysk.
Druga opcja (Maven module) pozwala na stworzenie nowego modułu, tzn. podprojektu — takiego, który ma rodzica. Przykładem może być moduł związany z obsługą bazy danych w większej aplikacji. W mniejszych projektach często istnieje podział na moduły wg warstw logicznych — obsługi danych (np. bazy danych), logiki biznesowej (serwisy) oraz prezentacji (np. aplikacja webowa i widoki HTML). W większych często jest to podział wg domeny (np. obsługa kart, obsługa transakcji, obsługa sprzedaży itp).
Trzecia opcja (Maven project) pozwala na utworzenie nowego projektu. Projekt to nadrzędna jednostka w Mavenie, jeden projekt może (ale nie musi) grupować kilka modułów.
Konfiguracja drugiej i trzeciej opcji jest niemal identyczna, różni się jedynie tym, że w przypadku modułu w pierwszym kroku wybieramy też rodzica. Screeny będą pokazane na przykładzie projektu (opcja trzecia).
Na pierwszym ekranie mamy do wyboru kilka opcji, związanych bardziej z wyglądem w Eclipse niż z działaniem m2e:
- Create simple project (skip archetype selection) — zaznaczając tą opcję pomijamy wybór archetypu (czyli ‘szablonu’ projektu, możemy skorzystać z gotowych lub z utworzonych przez nas) i tworzymy pusty projekt. Często zaczynając pracę będziemy korzystali właśnie z tej opcji, samodzielnie dodając zależności i tworząc strukturę projektu.
- Use default workspace location — możemy utworzyć projekt w innym miejscu na dysku niż domyślny katalog. Ta opcja nie zmienia nic w zachowaniu m2e, dotyczy jedynie fizycznego położenia plików na dysku
- Add projects to working set — ta opcja pozwala nam na wybranie working set’a, do którego dodamy projekt. Working set to coś w rodzaju katalogów — możemy pogrupować sobie projekty nad którymi aktualnie pracujemy (jest to pomocne, jeśli pracujemy nad wieloma jednocześnie, np. przy dużym projekcie)
- Rozwijając zakładkę Advanced mamy dodatkowe opcje, z których ciekawsza jest Name template — pozwala ona określić, pod jaką nazwą będzie się wyświetlał projekt. Ja proponuję [groupId].[artifactId] — dla mnie najlepiej się ona sprawdza, ale jest to bardzo kwestia osobistych preferencji. Tak, żeby Tobie było wygodnie :)
W drugim kroku konfigurujemy ustawienia specyficzne dla Mavena. Wymagane pola to:
- Group Id i Artifact Id — ‘współrzędne’ Mavena, więcej o nich znajdziesz w lekcji #7
- Version — wersja naszego projektu, najczęściej na początek warto zostawić domyślny numer. Numeracja wersji w Mavenie ma pewną konwencję i składa się z następujacych elementów (od lewej; elementy te są opcjonalne od Minor Version):
- Major version (0.0.1‑SNAPSHOT) — wersja główna, zwiększamy ją jak robimy bardzo duże zmiany, np. przepisujemy dużą część, zmieniamy cały (lub większość) interfejs itp
- Minor version (0.0.1‑SNAPSHOT) — wersja mniejsza, zmieniamy ją w przypadku dodania/modyfikacji znaczących funkcjonalności (ale nie wpływających na całą aplikację)
- Incremental (0.0.1-SNAPSHOT) — zmieniamy zawsze, gdy wprowadzamy jakieś nowe rzeczy (najczęściej w przypadku projektów komercyjnych zmieniamy w sytuacji kiedy udostępniamy nową wersję dla klienta/do pobrania)
- Build number (0.0.1-12) — nieczęsto używana notacja (ale nadal zgodna ze standardem), najczęściej w dużych projektach o zautomatyzowanym procesie wydawania oprogramowania
- Qualifier (0.0.1-SNAPSHOT) — to bardzo wazny element, ponieważ dodanie kwalifikatora ‑SNAPSHOT oznacza, że jest to wersja przejściowa i (najczęściej) nie do końca gotowa do działania w środowisku produkcyjnym. Często też takie wersje są wypuszczane częściej, jako podgląd. Przez to niektóre repozytoria nie przechowują ich (w takich wypadkach często można skonfigurować dodatkowe, osobne repozytorium na artefakty z tym klasyfikatorem). Inny przykład klasyfikatora to np. ‑beta, ‑alpha itp
- Packaging type — określa sposób, w jaki pliki w tym module/projekcie będą traktowane i przetwarzane w procesie budowania. Jest kilka standardowych typów, z którymi będziemy się spotykać najczęściej:
- pom — jeśli chcemy, aby nasz projekt/moduł był rodzicem dla innych, musimy wybrać ten rodzaj paczkowania
- jar — ten rodzaj jest przeznaczony do aplikacji standalone (takie, które do działania nie wymagają nic innego, np serwera aplikacji) oraz bibliotek (moduły naszej aplikacji często traktujemy właśnie jako biblioteki, które później są wykorzystywane przez np. aplikację webową lub inny interfejs)
- war — to paczkowanie tworzy strukturę katalogów dla projektu aplikacji webowej
- ear — jest to tzw. enterprise archive, które służy do paczkowania m.in. komponentów EJB, dość rzadko spotykane, ale można się z nim spotkac w większych projektach
Te informacje są wystarczające, aby utworzyć nowy projekt. Po kliknięciu na ‘Finish’ po chwili powinniśmy mieć skonfigurowany, gotowy do dalszej pracy projekt :)
Importuj projekt/moduł
Ta opcja pozwala nam m.in. zaimportować pliki źródłowe, które mamy na dysku jako projekt Maven. Po wybraniu opcji File -> Import i rozwinięciu zakładki ‘Maven’ mamy dostępne kilka opcji.
- Pierwsza opcja (Check out Maven Projects from SCM) działa analogicznie jak wspomniana wcześniej — pozwala pobrać pliki z repozytorium kodu i zaimportować je w Eclipse jako projekt Maven
- Druga opcja (Existing Maven Projects) będzie dla nas najbardziej przydatna i ją opiszemy szerzej, służy do zaimportowania plików, które mamy na dysku i traktowania ich jako projekt Maven. Oczywiście muszą mieć one plik pom.xml oraz strukturę zgodną z Mavenem
- Trzecia opcja (Install or deploy an artifact to a Maven repository) pozwala nam zaimportować artefakt (np. plik JAR) do repozytorium (co w efekcie umożliwi np. korzystanie przy pomocy Mavena z bibliotek, które nie są publikowane w ramach Mavena). Jest to bardzo przydatna opcja w szczególności, jeśli musimy korzystać z projektów pisanych dawno temu i chcemy używać Mavena do zarządzania nowym projektem (Uwaga! To importuje plik tylko do lokalnego repozytorium, tj. ktoś inny chcąc u siebie zbudować projekt, będzie musiał zaimportować te same artefakty co my do swojego repozytorium)
- Czwarta opcja (Materialize Maven Projects from SCM) pozwala na pobranie plików projektu i import jego źródeł na dysk z repozytorium kodu tylko na podstawie pliku pom.xml (o ile zawiera on informacje o lokalizacji repozytorium). Opcja stosowana dość rzadko (osobiście nie miałem okazji), niemniej na pewno warto wiedzieć, że istnieje
Skupmy się na drugiej opcji, czyli importowaniu plików, które mamy na dysku do Eclipse. Po wybraniu tej opcji zobaczymy okno podobne do poniższego:
Oczywiście początkowo główna część okna będzie pusta — po wyborze ścieżki w polu Root Directory Eclipse przeszukuje ten katalog i podkatalogi w poszukiwaniu plików pom.xml a następnie na tej podstawie tworzy listę projektów, które możemy zaimportować. Możemy wybrać wszystkie z nich lub tylko niektóre, w zależności od potrzeby.
Możemy także ustawić Working set, którego będziemy używać oraz schemat nazewnictwa (ukryty pod opcją ‘Advanced’).
Po kliknięciu ‘Finish’ przygotuj się na chwilę czekania, szczególnie z większymi projektami, Eclipse w tym czasie pobiera wszystkie zależności (oraz ich zależności), importuje kod, analizuje go, indeksuje i pewnie robi masę innych użytecznych rzeczy o których mam niewielkie pojęcie, w każdym razie — chwile to trwa :)
Konwersja projektu na Maven
Ta opcja dostępna jest z poziomu menu kontekstowego, jako Maven -> Enable Maven Nature lub z submenu Configure -> Convert to Maven Project. Obie te opcje jednak niosą ze sobą pewne ryzyka — decydując się na ich użycie, naprawdę należy być świadomym, co się robi. Ponieważ nie jest to coś, z czym możesz się spotkać na co dzień, nie będziemy zgłębiać tego tematu, mam nadzieję, że wybaczycie :)
Praca z plikiem pom.xml
Z użyciem wtyczki m2e możemy otworzyć plik pom.xml w specjalnym edytorze. Edytor ten podzielony jest na kilka zakładek, jak na przykładzie poniżej. Każda z tych zakładek została pokrótce omówiona poniżej.
- Overview — tutaj możemy skonfigurować ogólne parametry projektu, takie jak nazwa, rodzic, podmoduły, repozytorium kodu oraz inne metadane obsługiwane przez plik pom.xml. W przypadku modułów warto zwrócić uwagę na dwa przyciski znajdujące się w tej zakładce:
- Add pozwala dodać ISTNIEJĄCY moduł/projekt, jako moduł tego projektu
- Create pozwala utworzyć moduł, który będzie przypisany do tego projektu
- Dependencies — Tutaj możemy zarządzać zależnościami naszego modułu za pomocą prostego edytora graficznego
- Dependency Hierarchy — To bardzo przydatna zakładka w przypadku konfliktów wersji (np. potrzebujemy modułu A w wersji X, a poprzez inne zależności jest on też importowany w wersji Y) — pozwala nam przede wszystkim przejrzeć i przefiltrować wszystkie zależności, które występują w naszym module, jak też wykluczać je w razie potrzeby. (Uwaga praktyczna: filtrowanie potrafi działać bardzo powoli, szczególnie w dużych projektach)
- Effective POM — Kolejna z ważnych zakładek do rozwiązywania projektów, pozwala podejrzeć tzw. effective POM — czyli ujednolicony plik POM po dodaniu wszystkich elementów z plików POM projektów-rodziców i określeniu wartości wszystkich zmiennych. Tak naprawdę to effective POM decyduje o tym, jak projekt jest budowany. Jeśli więc jakieś z ustawień są nadpisywane, można to zweryfikować właśnie w tym miejscu
- pom.xml — tekstowa wersja pliku pom.xml, z czasem najczęściej będziesz korzystała właśnie z tej zakładki ;)
Rozwiązywanie problemów
Pracując z projektami Maven czasem możemy napotkać na pewne drobne problemy i bugi. Jest kilka sposobów, żeby sobie z nimi poradzić, możemy spróbować następujacych kroków:
- Nie panikujemy ;)
- Sprawdzamy w czym jest problem — być może zrobiliśmy np. literówkę. Możemy to sprawdzić w oknie ‘problems’:
- Na początku próbujemy po dobroci — wyczyścić trochę metadanych i odświeżyć (klikamy prawym przyciskiem myszki na projekt i wybieramy Maven -> Update Project. W oknie, które się pojawi wybieramy też ‘Force Update of Snapshot/Releases’ i klikamy OK. Ta operacja może zająć chwilę
- Jeśli to nie pomoże, czasem pomocne jest usunięcie projektu do Eclipse (uwaga, żeby nie zaznaczyć opcji usuwania także plików) i ponowne zaimportowanie go
- Kolejnym krokiem jest wyczyszczenie pamięci Eclipse pomiędzy usunięciem, a ponownym importem w tej kolejności:
- usuwamy projekt
- zamykamy Eclipse
- uruchamiamy z opcją czyszczenia (jak to zrobić możesz przeczytać tutaj)
- zamykamy
- uruchamiamy bez opcji czyszczenia
- importujemy projekt
Czasami pojawia się też problem tego rodzaju, że dodając projekt do serwera aplikacji w Eclipse (np. Tomcata), otrzymujemy błąd ClassNotFoundException. Czasem jest to spowodowane tym, że Eclipse z jakiegoś powodu ‘gubi’ informacje o zależnościach z Mavena. Najczęściej można to rozwiązać klikając prawym przyciskiem myszki na projekt, który sprawia problemy i wybierając opcję ‘Properties’. Następnie przechodzimy na zakładkę Deployment Assembly.
Upewniamy się, że jest tam pozycja ‘Maven Dependencies’. Jeśli jej nie ma, wykonujemy poniższe kroki:
- Wybieramy opcję ‘Add’
- W oknie, które się pojawi wybieramy ‘Java Build Path Entries’
- W kolejnym oknie wybieramy Maven Dependencies (całe, a nie któryś z podelementów)
- Klikamy ‘Finish’
Powyższe działania powinny pomóc w większości problemów z Mavenem, ale oczywiście może się zdarzyć, że natrafisz na inny problem. Warto zapytać swoich współpracowników, być może mieli podobny problem, lub napisac do nas — zawsze spróbujemy pomóc :)
Jeśli uważasz powyższą lekcję za przydatną, mamy małą prośbę: polub nasz fanpage. Dzięki temu będziesz zawsze na bieżąco z nowymi treściami na blogu ( i oczywiście, z nowymi częściami kursu Javy). Dzięki!