Robert Pofuk
Autor:
Robert Pofuk

Java software developer

Maven 101 - uvod u rad s Mavenom

Polazeći od najvažnijeg principa mavena “konvencija prije konfiguracije” (“convention over configuration”) možemo reći da maven u osnovi predstavlja skup standarda prije svega za:

  • opis projekta sa stajališta njegove organizacije, životnog ciklusa izgradnje, ovisnosti o ostalim projektima

  • strukture i organizacije repozitorija za razmjenu dijeljenih modula (u terminologiji mavena “artifact”)

  • faze životnog ciklusa izgradnje softvera

  • način sakrivanja logike izgradnje (build logic) i ponovno korištenje iste (reuse)

  • konvencija imenovanja predmeta

Također maven predstavlja i sam alat (software) koji omogućava korištenje navedenih standarda. Prednosti mavena su brojne:

  • usvajanjem maven konvencija postižemo lakše razumijevanje strukture projekta. Ukoliko razumijemo strukturu jednog maven projekta razumijemo i strukturu svih ostalih projekata baziranih na mavenu.

  • svi meta-podaci o projektu se čuvaju u jednoj pom.xml datoteci (Project Object Model)

  • maven se brine da sve predmete od kojih projekt zavisi osigura prilikom svake faze kojoj su predmeti potrebni (npr. prevođenje, pokretanje itd.). Povezane ovisnosti će također biti riješene.

Maven projekt se nalazi na adresi http://maven.apache.org/

1.1.Konfiguracija projekta u datoteci pom.xml

Sve informacije o projektu koji maven koristi čuvaju se u modelu koji je opisan xml datotekom, nalazi se u root direktoriju projekta, po konvenciji se zove pom.xml i naziva se Project Object Model. POM definira informacije kao što su naziv i vrsta artifacta, ovisnosti sa drugim predmetima, osobe zadužene za razvoj, version control sistem i parametre pristupa, način izgradnje artifakta itd. Upotrebom POM datoteke maven alat je u mogućnosti izvoditi svoje operacije uz minimalno korištenje parametara (najčešće je potrebno navesti samo naredbu koju želimo da maven izvrši). Struktura pom.xml datoteke je opisana na adresi http://maven.apache.org/ref/3.2.1/maven-model/maven.html.

Više informacija o POM datoteci se može naći na http://maven.apache.org/pom.html.

1.2.Maven predmeti

Predmet (engl. Artifact) predstavlja rezultat izgradnje jednog maven projekta. Svaki maven projekt kao svoj rezultat daje predmet (artifakt) koji je, kada je u pitanju java, najčešće jar datoteka ali to ne mora biti pravilo. Predmet može biti i model, biblioteka nekog operativnog sistema (npr. dll ili so) itd.

Maven prisiljava korisnika da maksimalno koristi SoC (Separation of Concerns) princip time da sve što se na bilo koji način može koristi neovisno treba kreirati kao poseban projekt koji rezultira posebnim artifaktom. Na taj način svi projekti koji koriste taj predmet to mogu navesti u svojoj POM datoteci.

1.3.Maven repozitorij

Maven repozitorij predstavlja skladište predmeta (to su najčešće, ali ne nužno, jar datoteke). Skladište može biti lokalno (na disku računala na kojem se projekt razvija) i mrežni (na udaljenom serveru).

Prilikom rješavanja ovisnosti maven će sve predmete koji ne postoje u lokalnom repozitoriju potražiti na mrežnom i napravit će kopiju predmeta u lokalnom repozitoriju.

Lokalno skladište se čuva na lokalnom disku tako da se predmeti dijele između svih projekata koji ih koriste. Prilikom zadavanja naredbi za prevođenje, izgradnju, pokretanje itd. maven će osigurati da se odgovarajući predmeti iz lokalnog repozitorija nađu na classpathu-u java procesa koji se izvršava. Ovo omogućava da lokalno postoji samo jedna kopija koja nije dio klijentskog projekta pa samim tim ne treba ući kao dio projekta (ako komponenta nije naša nadležnost i nema smisla da je čuvamo u sistemu za kontrolu verzija). Predmet koji koristimo će biti ažuriran na novije verzije kada postanu dostupne ukoliko smo tako definirali ovisnost.

1.4.Transitive dependecies

Pod transitivnim ovisnostima podrazumijeva se sljedeće:

Neka naš projekt ovisi direktno od predmeta A (npr. ukoliko je u pitanju jar datoteka recimo da naš kod koristi neke klase iz te datoteke). Nadalje, neka predmet A ovisi o predmetu B i C. Kažemo da naš projekt prijelazno ovisi od predmeta B i C. Maven nam olakšava posao u smislu da navodimo samo predmete o kojima naš projekt direktno ovisi. Maven se brine da odredi prijelazne ovisnosti i osigura sve predmete u lokalnom skladištu o kojima naš projekt ovisi bilo direktno ili prijelazno.

1.5.Faze životnog ciklusa izgradnje (engl. build life cycle phases)

Prilikom izgradnje softvera oslanjamo se na standardni redoslijed akcija (npr. priprema, generiranje koda, prevođenje, testiranje, pakiranje, instalacija). Maven definira određeni broj faza koje se u nizu izvršavaju i koje definiraju akcije ili ciljeve koje je potrebno ispuniti.

U radu sa mavenom mi najčešće zadajemo fazu koju želimo izvršiti i maven će izvršiti sve faze od prve do zadane uključujući i zadanu. Npr. ako želimo odraditi pakiranje predmeta (npr. kreiranje jar datoteke) maven će obaviti svu potrebnu pripremu, prevođenje i testiranje prije nego što kreira jar datoteku. Na taj način se osigurava konzistentnost.

Skup akcija koje je potrebno izvršiti u svakoj od faza određeni su vrstom predmeta tako da, ukoliko je predmet jar arhiva, maven ima potrebno znanje o tome na koji način će obaviti prevođenje, testiranje i pakiranje

Dodatne informacije o životnom ciklusu izgradnje mogu se naći na http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html


1.6.Maven priključci (engl. plugins)

Akcije koje se izvršavaju u svakoj fazi određene su maven pluginima. Plugin je modul koji definira akciju ili cilj koji se izvršava u određenoj fazi izgradnje. Pisanjem korisničkih plugina moguće je definirati logiku izgradnje koju se zatim može koristiti i na ostalim projektima.

Distribucija plugina se obavlja na isti način kao i distribucija predmeta - putem maven skladišta što znači da kreiranjem plugina i njegovom instalacijom na udaljeno skladište (ovo se obavlja jednom maven komandom) plugin postaje dostupan i ostalim članovima tima kao i svim timovima i projektima koji imaju pristup skladištu.

Lista maven plugina se može naći na http://maven.apache.org/plugins/

1.7.Instalacija mavena

Maven je alat pisan u programskom jeziku Java i kao takav zahtjeva ispravno instaliran i konfiguriran JRE. Dakle potrebno je konfigurirati putanju do jave kao i JAVA_HOME varijablu okruženja).

Instalacija mavena se svodi na raspakiravanje arhive na lokalni disk i dodavanje maven bin direktorija u korisničku putanju (PATH).

Uspješnost instalacije se može provjeriti izdavanjem komandi

java – version

mvn - version

1.8.Podešavanje maven instalacije

Maven može raditi bez dodatne konfiguracije ukoliko koristimo samo standardno maven repozitorij i ukoliko imamo direktnu vezu preko http protokola. Ukoliko to nije slučaj možemo dodatna podešavanja obaviti unutar <home>/.m2/settings.xml datoteke. Parametri definirani u toj datoteci će važiti za trenutnog korisnika na sustavu.

Struktura settings.xml je opisana na adresi http://maven.apache.org/ref/3.2.1/maven-settings/settings.html.

1.9.Kreiranje inicijalnog projekta

Ukoliko započinjemo novi projekt najjednostavnije je da inicijalnu strukturu kreiramo sa sljedećom naredbom:

mvn archetype:generate

-DgroupId=com.test.app

-DartifactId=my-app

-DarchetypeArtifactId=maven-archetype-quickstart

-DinteractiveMode=false



Kreirat će se direktorij my-app sa strukturom prikazanom slikom. Cjelokupan izvorni kod projekta se nalazi u direktoriju src. Java kod se nalazi u direktoriju java unutar src direktorija. Unit test klase se nalaze unutar test/java direktorija. Inicijalni POM ima sadržaj:

Vidimo da inicijalni POM definira grupu, ID predmeta, njegovo ime, vrstu pakiranja, ovisnosti (u ovom slučaju samo junit u verziji 3.8.1 s obzirom da ga AppTest.java referencira.

1.10.Verzije predmeta

Da bi se omogućilo efikasno upravljanje verzijama predmeta kao i rješavanje konflikata maven koristi slijedeću konvenciju zadavanja verzija

major.minor.bugFixqualifier-buildNumber

kvalifikacijski dio verzije je namijenjen da označi verzije prije izdavanja glavne (release) verzije (kod koje se kvalifikator i broj izgradnje izostavlja). Kvalifikator i broj izgradnje su opcionalni i može se zadati samo jedan od njih. Također je opcionalno navođenje kvalifikatora koji označava ispravljanje pogrešaka.

Postoji poseban kvalifikator koji određuje da je predmet kreiran korištenjem najsvježijeg koda iz skladišta. To je kvalifikator snapshot. Maven će ukoliko se navede ovisnost prema takvom predmetu provjeravati pojavu nove verzije (iako ima istu oznaku verzije) i preuzimati ga iz skladišta.

1.11.Definiranje ovisnosti

Direktna ovisnost se definira navođenjem odgovarajućeg dependency bloka unutar dependencies bloka

Moguće je zadati i fazu u kojoj ovisnost vrijedi putem scope tag-a. Npr. junit je potreban samo u fazi testiranja, a ne i u fazi pakiranja ili prevođenja tako da se može postaviti scope na test. Podrazumijevani scope je compile što znači da će referencirani predmet biti u classpathu-u prilikom prevođenja koda.

Primjer ovisnosti prema jtds JDBC prilagodniku:

1.12.Lokalno skladište

Lokalno skladište kao i podešavanje pristupa udaljenim skladištima nalazi se u profilu korisnika u direktoriju pod nazivom “.m2”.

1.13.Prevođenje koda

Prevođenje koda se obavlja naredbom mvn compile. Rezultat prevođenja će biti smješten u direktorij target/classes.

Napomena: Podrazumijevana verzija java byte code-a koji se generira kao i sintakse koja se koristi u tekućim verzijama maven-compiler-plugin je 5. Da bi maven prevodio kod za 7 potrebno je u POM-u postaviti konfiguraciju za 7:

1.14.Testiranje

Unit testiranje se obavlja komandom

mvn test

1.15.Izgradnja artifakata

Kreiranje predmeta (npr. jar datoteke) se obavlja naredbom

mvn package

Rezultat izgradnje se smješta u direktorij target. Naziv predmeta je kreiran po maven konvenciji artifactId-verzija.vrsta pakiranja. Npr.

my-test-0-SNAPSHOT.jar

1.16.Instalacija predmeta u lokalno skladište

Obavlja se naredbom

mvn install

Rezultat naredbe biti će izgradnja predmeta i njegovo kopiranje na lokaciju unutar skladišta (.m2/repository), određenu grupom kojoj predmet pripada, artifacID-om i verzijom. U primjeru stdForm predmet biti će smješten na lokaciju

${home}/.m2/repository/com/mycompany/app/my-test/0-SNAPSHOT/

1.17.Integracija sa IDE eclipse

Eclipse plugin definira akcije kreiranja potrebnih projektnih datoteka za Eclipse. Ovisnosti (unutar .classpath datoteke) se navode sa prefiksom M2_REPO u putanji pa je za ispravno rješavanje ovisnosti iz eclipse-a potrebno definirati varijablu tako da u sebi sadrži putanju do lokalnog maven skladišta.

U eclipse-u se to može postaviti na Window > Preferences > Java > Build Path > Classpath Variables, kreirati novu varijablu. U polje Name upisati M2_REPO, a u polje Path upisati apsolutnu putanju do lokalnog maven skladišta.

Maven je moguće pozvati iz eclipse-a tako da se na željeni projekt klikne desnom tipkom miša → Mavan → Maven build I u goals unese željena faza ciklusa.

1.18.Hijerarhijska struktura projekta (nasljeđivanje i agregacija)

Moguće je definirati veze generalizacije između POM-ova. Ukoliko nije naveden POM koji se nasljeđuje tada se nasljeđuje Super POM u kojem su definirane podrazumijevane vrijednosti za strukturu direktorija, podrazumijevano skladište za predmete i priključke itd.

Super POM možete vidjeti na adresi:

http://maven.apache.org/guides/introduction/introduction-to-the-pom.html

Naredbom:

mvn help:effective-pom

može se vidjeti kompletan, razriješen POM projekta. Nasljeđivanje POM-ova se obavlja unutar taga parent na sljedeći način:

Pri čemu je relativePath tag opcionalni i govori mavenu gdje da pogleda prije pretraživanja lokalnog ili udaljenog skladišta.

Osim nasljeđivanja maven uvodi i mehanizam agregacije projekata čime omogućava kreiranje hijerarhijske strukture pod-projekata.

Agregacija se obavlja kreiranjem agregator projekta čiji je tip predmeta pom:

Struktura agregiranog projekta biti će kao na Slika 9: Struktura više modularnog projekta


Najčešće se agregacija i nasljeđivanje kombiniraju tako da se agregator POM ujedno nasljeđuje u podprojektima čime nam se omogućava da podešavanja koja su zajednička za sve podprojekte definiramo u POM-u agregator projekta.

Ukoliko postoji veza ovisnosti između podprojekata agregiranog projekta tada će naredba

mvn eclipse:eclipse

generirati odgovarajuće .classpath datoteke sa vezama ovisnosti prema odgovarajućim projektima iz radnog prostora u eclipse-u. Ukoliko ne želimo da korištene ovisnosti budu projekti u razvoju već instalirani projekti u skladištu potrebno je konfigurirati eclipse plugin da u .classpath datoteke stavlja reference prema predmetima u skladištu.

Ovo može biti navedeno unutar POM-a određenog projekta ili unutar roditeljskog POM-a čime će biti primijenjeno nad svim podprojektima.

Prilikom generiranja ovisnosti prema projektu iz radnog prostora podrazumijeva se da se projekt nalazi u direktoriju čije ime je jednako artifaktId-u odgovarajućeg predmeta.

2.Reference

  1. Vinsent Massol, Jason Van Zyl, Better Builds with Maven, Mergere Library Press, Mart 2006.

  2. Eric Redmond, The Maven 2 POM demystified, http://www.javaworld.com/javaworld/jw 05-2006/jw-0529-maven.html, JavaWorld, 05/29/06

  3. Maven project, http://maven.apache.org/

Popularne teme
.NET ABAP ADFS Agile Always On Anemic Model Angular Azure Backbone benchmark BI BI projekti Bootstrap building people business inteligence Business Intelligence Change Chrome CI CITCON Claims compile Continuous Delivery continuous deployment Continuous Integration CSR d3js data data visualization Data visualization alati DDD dekompozicija dependency injection dinamička forma dinamički parametri dinamički query distribuirani razvoj Domain-Driven design DOP društvena odgovornost edge-based video analytics Eliminating waste enkapsulacija enterprise razvoj softvera ERP ETL Excel FIORI Frontend game Geopackage GPKG GIS Git Groovy heat map HICCUPS Hichert HTML IBCS interoperability invision IoT IPSO izvještavanje java JavaFX Javascript Jazz Build Engine JBE Jenkins jquery jqueryui jsfiddle JVM Kaizen Kanban king KING ICT Kingovci Knockout kvaliteta lambde leadership Lean legacy code M language Management Maven Metodologija microservices Microsoft mobile Mobility mockups moć monday game NetWeaver network nodejs oblikovni obrasci OGC OKR open source optimizacija organizacija organizacijska struktura OutOfMemoryError outsourcing overengineering paginacija Performance performanse PERT PMI PMP; Agile; Project management; Scrum; KING ICT; razvoj; metodologija podatkovni skup pouzdanost Power BI Power Map Power Pivot Power Query Power View pretraga proces procjena Product Owner programming proizvod Project manager projektni plan radar Rational Team Concert razvoj tima refaktoriranje Release resize responsive charts REST retrospektiva Rich-Domain model Roko Roić rolling wave planning RTC SAP scale scatterplot chart Scrum scrum team scrum tim service boundaries single responsibility principle Single Sign-On smart metering SoapUI social responsibility softver Software software prototyping Software Testing Club Spring Boot SQL standard sustav videonadzora svg tdd Team team building team development Team Foundation Server tech tehnologije terminski plan Testing tim timesheet timovi Toggl.com touch transakcijski nadzor tražilica underengineering unit testing Uspjeh Visual Studio vodstvo vodstvo leadership moć društvena odgovornost DOP social responsibility CSR vođenje projekata WBS Web Zagreb STC

PRIJAVA NA NEWSLETTER

Najnovije novosti iz ICT svijeta