Maven 1.x – praktyczne wprowadzenie
Materiał ten powstał na potrzeby projektu Weed , chciałem to trochę poukładać, dopracować i dlatego publikuje to ponownie jako wpis na blogu. W obecnej sytuacji zaczynanie projektu w oparciu o maven 1.x mija się z celem. Wersja 1.x jest zasadniczo różna od aktualnej gałęzi projektu, ale być może zawarte tu informacje przydadzą się podczas grzebania w źródłach z jakiegoś już istniejącego projektu który właśnie z 1.x korzysta.
Zaczynamy, na początek potrzebujemy ściągnąć sobie maven’a – stąd. Proces instalacji został opisany dość dobrze na stronie. Nie jest to nic specjalnie wyzudanego
. Po pomyślnym zakończeniu instalacji, czas na stworzenie pierwszego projektu. Wybierz katalog w którym masz prawa do zapisu i uruchom konsolę. Prawdopodobnie trzeba będzie ustawić zmienną PATH, żeby mavena można było wołać zewsząd. Wpisz maven genapp, wynikiem działania tego polecenia będzie szkielet aplikacji. Przykładowa aplikacja zawiera jedną klasę wykonywalną i test dla tej klasy, możemy też przyjrzeć się plikowi project.xml, który jest jądrem każdego projektu mavenowego.
Teraz czas na integracje z Eclipse’m, projekt który wygenerowaliśmy nie da się zaimportować do naszego ulubionego IDE. Konieczne jest wygenerowanie deskryptorów, oczywiście maven zrobi to za nas
w katalogu głównym projektu wywołujemy maven eclipse. Wszystko jest już prawie gotowe do pracy, importujemy projekt do Eclipse’a (import existing project into workspace…).
Maven wprowadza bardzo ciekawy sposób zarządzania zależnościami w projektach, najlepiej zilustruje to prosty przykład. Dodamy do naszej aplikacji logowanie. Czym są logger’y i po co go używać? Wypisywanie komunikatów na standardowe wyjście jest bardzo niefajne, wiedzieli już o tym programiści C (strumienie suxx
). W poważniejszych zastosowaniach zaleca się stosowanie jakiejś biblioteki logującej np. log4j.
Otwórz plik project.xml i dopisz następujące linie (po tagu </developers>)
<dependencies> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.13</version> </dependency> </dependencies>
Zmieńmy też odrobine App.java, powinien on wyglądać tak:
import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Logger;
/**
* Hello world!
*
* @author <a href="http://rose.man.poznan.pl/%7Emaneo/maven/jason@zenplex.com">Jason van Zyl</a>
*
*/
public class App
{
private static Logger logger = Logger.getLogger(App.class);
public static void main( String[] args )
{
BasicConfigurator.configure();
logger.info("hello world");
}
}
Wykonaj teraz polecenie (katalog główny projektu, konsola systemowa:)): maven clean java:compile.Maven sam spróbuje ściągnąć brakującą bibliotekę z zdalnego repozytorium*.
Tak właśnie wygląda pełen cykl dodawania zależności, nie musimy trzymać bibliotek w cvs/svn są one potrzebne tylko na etapie kompilacji (ewentualnie testowania). Oszczędzamy miejsce, wszystkie zależności są wersjonowane, sama struktura opisu w project.xml u pozwala wyspecyfikować skąd- w przypadku braku danej biblioteki w repo ściągnąc, można ją ściągnąc. Maven nie zawsze będzie ściągał deklarowane przez nas jar’y. Po instalacji na naszym komputerze zostaje stworzone lokalne repozytorium zależności, tam przechowywane są wszystkie zależności. Jeżeli ponownie użyjemy log4j w jakimś innym naszym projekcie maven nie będzie ściągał go ponownie tylko posłuży się tym co ma w lokalnym repo (więcej o repozytoriach tutaj). Jedna uwaga o zdalnych repozytoriach, to z jakich będzie korzystał maven, możemy określić za pomocą zmiennej maven.repo.remote którą ustawiamy w pliku project.properties (lub build.properties) np. maven.repo.remote=http://public.planetmirror.com/pub/maven/,http://www.ibiblio.org/maven/
Może się zdarzyć, że szukanej przez nas biblioteki/jar’a nie ma w zdalnym repozytorium które jest domyślnie ustawione w maven. Tak jak pisałem, jeżeli nie nie uda się ściągnąć potrzebnej biblioteki należy zrobić to samemu i ściągniętego jar’a zainstalować w naszym lokalnym repozytorium zależności. Najprościej będzie to zrobić ręcznie, musimy umieścić jar’a w odpowiednim katalogu w lokalnym repozytorium. Weźmy naszego log4j’a w lokalnym repo musimy mieć katalog log4j (taki jak groupId w tagu dependency) w którym musimy mieć katalog jars i tam wrzucamy jar’a którego nazwa musi być zgodna z wzorem artifactId-version.jar (czyli log4j-1.2.13.jar). Gdzie znaleźć lokalne repo? Domyślnie znajduję się ono w katalogu domowym użytkownika w katalogu .maven/repository).
Po uaktulanieniu opisu projektu (project.xml) wpisz raz jeszcze: maven eclipse aby uaktualnić deskryptory projektu eclipse’owego.
Maven pozwala tworzyć własne skrypty dzięki którym możemy automatyzować wykonywanie pewnych czynności w projekcie. Skrypty te umieszczmy w pliku maven.xml (w tym samym katalogu gdzie znajduje się project.xml.
<project xmlns:maven="jelly:maven" xmlns:j="jelly:core"
xmlns:util="jelly:util" xmlns:x="jelly:xml" xmlns:ant="jelly:ant">
<goal name="mygoal" prereqs="java:compile">
<ant:copy file="${maven.src.dir}javamyfile.txt" tofile="${maven.build.dest}myfile.txt"/>
</goal>
</project>
Co to za język?
Jelly! Osobiście nie jestem jego wielkim fanem, trzeba jednak przyznać, że da się w nim zrobić całkiem sporo. Stwórz plik myfile.txt w katalogu src\java\ i wpisz w konsoli : maven mygoal. Sporą część standardowych zadań w projekcie maven załatwia sam z siebie, więc jest spora szansa, że nie będzie potrzeby dotykania Jelly.
Kolejną fajną właściwością m. jest generowanie raportów ze statycznych analiz kodu, maven pozwala generować raporty za pomocą takich narzędzi jak FindBugs, PMD czy Simian. Chcąc skorzystać z raportów, niejako “przy okazji” wygenerujemy stronę www dla naszego projektu
. W project.xml specyfikujemy jakie raporty chcemy wygenerować: (na samym końcu tuż przed tagiem </project>)
<reports> <report>maven-checkstyle-plugin</report> <report>maven-simian-plugin</report> </reports>
Teraz aby wprowadzić słowa w czyn musimy wpisać w konsoli maven site. W katalogu /target/docs/index.html znajdziemy wyniki działania mavena. Zawartość sekcji Project info i Project reports możemy wyspecyfikować w pliku project.xml.
I to tyle na początek
.