niedziela, 5 stycznia 2014

maven

Co Tobie oferuje maven: 



  - deklaratywność (struktura i zawartość projektu są z góry znane )
  - zarządzanie zależnościami (automatycznie je pobiera i konfiguruje)
  - wbudowane narzędzia do kompilacji, testowania, wdrażania aplikacji itd.
  - bogactwo pluginów
  - integracja z repozytoriami
  - integracja z CI
  - integracja z systemami śledzenia błędów
  - integracja z narzędziami badającymi jakość kodu
 
Instalacja:
 1. Instalacja jdk
 2. Zdefiniowanie JAVA_HOME
 3. Pobranie projektu Apache Maven
 4. Rozpakowanie projektu
 5. Dodanie ścieżek do katalogu maven/bin
 6. Stworzenie ewentualnych linków symbolicznych
 7. Eksport zmiennych :
        MAVEN_REPO=/home/przodownik/repo
        MAVEN_HOME=/home/przodownik/apache-maven
Konfiguracja:
Dodajemy możliwość debugowania oraz ustawiany ramy pamięci:
 MAVEN_OPTS="-Xmx1024m -XX:MaxPermSize=256m
-agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=n"
w pliku settings.xml:
- ustawiamy ścieżkę do lokalnego repozytorium bibliotek
- ustawiamy proxy jeśli takie występuje
- ustawiamy dostęp do różnych serwisów czy serwerów np. nexusa
- ustawiamy mirrory zasobów
- ustawiamy profile działania aplikacji

Pliku pom.xml 

Model obiektów projektu Maven – POM (Maven project object model)
pom.xml zawiera szczegółowy opis naszego projektu.
- definiuje strukturę projektu
- definiuje zależnościami projektu oraz zależności bibliotek
- definiuje tym wytworzonego produktu (ear, war, jar, sar, pom, rar, par etc)
- definiuje wersję produktu (version)
- definiuje zasoby aplikacji i zasoby testowe
- definiuje członków zespołu, kontakt do nich
- definiuje system kontroli wersji, CI oraz system zgłaszania błędów
- definiuje wersje (bibliotek i javy)

i tak w pom.xml wyszczególniamy:

groupId - definiuje określony projekt lub zbiór bibliotek w ramach firmy czy organizacji

artefactId - definiuje faktyczną nazwę projektu

version - definiuje kolejne wersji w ramach wersji rozwojowej (snapshot) lub wersji stabilnej i docelowej (release)

scm - definiujemy system SCM (svn, git etc)

issue Management - system śledzenia błędów (jira, trac, etc)

ciManagement - definiujemy system CI (jenkins, bamboo, etc)

developers - w tej sekcji w ramach znacznika <developer> definiujemy programistów, którzy pracują nad danym projektem

contributors - dostawcy uczestniczący w projekcie

name - nazwa do wyświetlenia

packaging - sposób pakowania artefaktu

url - link do projektu

inceptionYear - rok rozpoczęcia projektu

organization - organizacja , firma

licenses  - typ licencji

Inżynieria mavena to:

Automatyzacja budowy paczek
  - kompilacja źródeł do wersji binarnych
  - tworzenie różnych rodzajów paczek
  - odpalanie testów, regresja
  - przenoszenie paczek na zdalne maszyny (repozytoria)
  - tworzenie dokumentacji i release notes

Modularyzacja projektu
 - możemy tworzyć wiele modułów, zarządzanych przez wspólne zależności i procesy zdefiniowane w parent projekty (<packaging>pom</packaging>)

Zarządzanie zależnościami
- dependencyManagement jako dobra praktyka (wszystko definiujemy w parent pom.xml a w poszczególnych pom.xml (child) pomijamy już wersje biblioteki)

Badanie jakości kodu
   - pluginy
   - mvn site
   - sonar

Testowanie
    - mvn test (surfire)

Testy integracyjne i akceptacyjne
   - selenium start (pre-integration-test np w kontenerze jetty )
   - selenium stop (post-integration-test)
   - mvn integration-test
   - mvn verify
   
Automatyczne deployment
    - mvn  deploy:deploy
     release steps :
        - mvn release:clean
        - mvn release:prepare
        - mvn release:perform


Jeśli zdalne repo dostępne jest np przez FTP musimy zastosować jeszcze inny plugin (build section):

Szybki start (PoC) :

archetype – szablon projektu
mvn archetype:generate
-DarchetypeArtifactId=maven-archetype-quickstart
-DgroupId=pl.java.borowiec -DartifactId=myApp
bez trybu interakcji: -DinteractiveMode=false

użycie samego mvn archetype:generate pozwala nam wybrać typ projektu na samym stracie. Tym samym zwiększa to np. szybkość tworzenia naszego PoC.


Przykładowe moduły:

compiler – odpowiada za kompilację
clean – czyści zasoby po procesie budowy
deploy – umieszcza produkt w zdalnym repozytorium
failsafe – odpala testy integracyjne JUnit w izolowanym classloader
install – umieszcza artefakt w lokalnym repozytorim
site – generuje raport
surefire – odpala testy Junit w izolowanym classloder
changelog – generuje listę zmian z SCM
checkstyle – sprawdzanie jakości i standaryzacji kodu
pmd – sprawdzanie jakości i standaryzacji kodu
assambly – budowanie dystrybucji paczki
release – wydanie wersji release i umieszczenie jej w SCM tags
eclipse – generacja projektu dla eclipse
idea – generacja projektu dla idea

Wybrane komendy:

mvn -version – wyświetlenie wersji mavena
mvn test – testowanie projektu
mvn package – budowanie artefaktu
mvn install - instalacja artefaktu na lokalnym repozytorium
mvn site – generowanie raportów
mvn release – dostarczanie paczki i umieszczanie jej w tags
mvn deploy – dostarczanie paczki
mvn clean install – czyszczenie i instalacja artefaktu
mvn clean package -U – pobieranie bibliotek ze zdalnego repozytorium
mvn -o - tryb offline, nie próbuje się łączyć ze zdalnym repozytorium
mvn package -X - debugowanie
mvn -Dmaven.test.skip=true - pomijanie testów (antipattern)
mvn -Dmaven.test.skip {nazwa klasy testu } - pomijanie konkretnego testu

mvn versions:display-dependency-updates - pokazuje zależności, które są w nowych wersjach na zdalnych repozytoriach w porównaniu z tymi które używamy obecnie (przykład)

mvn versions:display-plugin-updates - pokazuje pluginy, które są w nowych wersjach na
zdalnych repozytoriach w porównaniu z tymi które używamy obecnie (przykład)

mvn dependency:tree -Ddetail - pokazuje drzewko zależności (przykład)
mvn dependency:list – pokazuje listę zależności (przykład)
mvn help:effective-pom – pomoc w tworzeniu 'efektywnego poma'
mvn help:effective-settings – pomoc w tworzeniu 'efektywnych ustawień settings.conf' (przykład)
mvn help:system – pokazuje zmienne środowiskowe
mvn dependency:build-classpath – pokazuje classpath użyty do budowy artefaktu
mvn help:all-profiles - wyświetlenie wszystkich zadeklarowanych profili (przykład)
mvn archetype:generate – wybór archetypu do budowy szkieletu projektu
mvn install:install-file -Dfile=\home\przodownik\some-{version}.jar -DgroupId=pl.java.przodownik
-DartifactId=commandApp -Dversion={version} -Dpackaging=jar 
- instalowanie artefaktu do lokalnego repozytorium
mvn dependency:analyze – określa które zależności mają status np. unused

przykładowy wydruk:
[WARNING] Unused declared dependencies found:
[WARNING]    org.hamcrest:hamcrest-all:jar:1.3:test
[WARNING]    org.mockito:mockito-all:jar:1.9.5:compile
[WARNING]    org.easytesting:fest-assert:jar:1.4:compile
mvn -DdownloadSources=true -DdownloadJavadocs=true - dociąga źródła i dokumentacje

mvn help:describe -Dcmd={test, clean, install, compile, etc} -  wyświetlanie cyklu życia (przykład)

Generalna zasada:

mvn [plugin_name]:[goal]   !!!
Zasada ta działa jak w podanym przykładzie (przykład)

Fazy budowy:
1. process-resources -  resources:resources
2. compile - compiler:compile
3. process-test-resources resources:testResources
4. test-compile  compiler:testCompile
5. test  surefire:test
6. package jar:jar
7. install install:install
8. deploy  deploy:deploy


Cykl życia:
1. validate -walidacja projektu

2. initialize -inicjalizacja zmiennych, tworzenie katalogów

3. generate-sources -generacja źródeł

4. process-sources -przetwarzanie kodu źródłowego , np. w celu przefiltrowania pewnych wartości

5. generate-resources -generowanie zasobów.

6. process-resources -kopiowanie i przetwarzanie zasobów do katalogu  wynikowego

7. compile -kompilacja kodu źródłowego

8. process-classes-post-process -generowanie plików dla kompilacji

9. generate-test-sources -generacja kodu potrzebnego do testów

10. process-test-sources -filtrowanie zasobów do testów

11. generate-test-resources -tworzenie zasobów do testów

12. process-test-resources -kopiowanie i przetwarzanie zasobów do katalogu wynikowego testów

13. test-compile -kompilacja testów

14. process-test-classes -przetwarzanie testów w celu np. udoskonalenia bytecodu

15. test -odpalanie testów

16. prepare-package -wykonywanie operacji, które mają za zadanie przygotować klasy i zasoby do wytworzenia artefaktu

17. package -wykorzystanie już skompilowanego kodu i wytworzenie paczki zgodnie z definicją pom.xml np. jar czy ear

18. pre-integration-test -wykonywanie zadań przez testami integracyjnymi

19. integration-test -wykonanie testów integracyjnych jeśli takie są zdefiniowane w pom.xml

20. post-integration-test

21. verify -wykonanie zadań po przeprowadzeniu testów integracyjnych np. czyszczenie zasobów,  sprawdza poprawność paczki

22. install - umieszcza paczkę w lokalnym repozytorium

23. deploy - umieszcza (publikuje) paczkę w zdalnym repozytorium


Zasięg (scope)

compile – kompilacja , testowanie i uruchomienie . Biblioteka zawsze jest
dołączana do wyprodukowanej artefaktu. Wartość domyśla.

provided – kompilacja i testowanie. Maven zakłada , że paczka zostanie
dostarczona przez kontener na którym artefakt będzie docelowo działał
np. Servlet API , czy Hibernate

test – kompilacja testów oraz testowanie . np. junit , mockito

runtime – testowanie i uruchomienie . Biblioteka jest potrzebna podczas
uruchamiania testów oraz do działania artefaktu na danym kontenerze.

system – z jakiś powodów nie umieszczamy biblioteki w repozytorium ale
dostarczamy ją z jakiejś lokalizacji dyskowej

Struktura katalogów:
Praktyka:

Centralizacja ustawień wersji (properties): 
Pozwala na to na łatwe zarządzanie wersjami w całym projekcie a także na błyskawiczną podmianę wersji jak w poleceniu:

 mvn install -Dorg.springframework.version=3.2.5.RELEASE

Testy:

Wyłącznie:
Włączanie poszczególnych testów:
Wyłączanie poszczególnych testów:
Wykorzystując polecenie :
   mvn install -Dmaven.test.skip=true
      lub:
   mvn install -DskipTests=true 


Ignorowanie testów które się zakończyły się niepowodzeniem (TDD)


Wbudowane kontenery :
   
Uruchamianie: mvn jetty:run

Uruchamianie: mvn tomcat7:run

Profile:

Profile służą do definiowana zachowania w zależności od warunków.
Np możemy zdefiniować sobie zmienne środowiska jak :
 - develop (rozwojowe)
 - stage (pomostowe)
 - production (produkcyjne)

I tak przełącznik -Pdevelop załaduje nam zasoby związane z danym profilem czyli np: testową bazę danych, testowy adresy WS , plus inną konfiguracją cechującą testy.

Uruchomienie : mvn package -Pproduction

Uwaga : profile można łączyć :
 mvn install -P profile-1,profile-2

  lub które nie mają być aktywowane:

 mvn install -P !profile-1,!profile-2

 jak również tworzyć konfiguracje aktywacyjne:
Ukrywanie wrażliwych informacji

Hasła zapisuje w pliku setting.conf w katalogu maven

Filtrowanie zasobów:
przykład znajdziecie tutaj.

Przekazywanie zmiennych:
mvn compile -Ddatabase=oracle
wykorzystujemy przełącznik -D{name}={value}
przykład znajdziecie tutaj

Najlepsze praktyki:

- dependency management (dependencyManagement)
- profile (dev, prod, stage, user_specific)
- properties (centralizacja ustawień wersji)
- rozdzielanie na moduły (enity, core, integration, dao, web, etc)

- nexus , artifactory (proxy repo)


- współpraca Agile : CI , IssueManager

- listy mailingowe
- maven Repository (http://mvnrepository.com/)
- Enforcer Plugin (omijanie kłopotów z konfliktami bibliotek)
- build-helper-maven-plugin (podczepianie wygenerowanych źródeł)
- wbudowane kontenery Jetty, Tomcat -stosowane podczas rozwijania systemu
- raportowanie i statystyki (testowanie, pokrycie testami, jakość kodu, java docs,  sonar , scm statistisc etc )
- M2Eclipse wtyczka do Eclipse
- wrażliwe informacje przetrzymujemy w settings.conf
- exclude w stosunku do niektórych bibliotek w hierarchii zależności (classloader problem)
- testy (maven-failsafe-plugin, selenium-maven-plugin, pitest-maven, jmeter-plugin, soapui-plugin, etc)
- DSL (maven-apt-plugin)
- metamodel (hibernate-jpamodelgen, etc)

Maven + scala , groovy (integracja, to przyda się nam  potem ;))


Groovy:

Konkurencja:

- Ant (imperatywny)
- Ivy (posiada zarządzanie zależnościami)
- Gradle (tak naprawdę jedyny poważny konkurent, groovy)
               (deklaratywny + imperatywny)

Brak komentarzy:

Prześlij komentarz