Informačné technológie sa neustále rozvíjajú a poskytujú čoraz viac funkcionality. Aplikácie sa preto stávajú zložitejšie a využívajú stále viac knižníc tretích strán. Manuálne udržovanie závislostí na externé knižnice a zostavovanie projektov by tak bolo náročné a neefektívne. Aby bol proces spravovania projektov jednoduchší, vznikli nástroje ako (Apache) Maven.
Funkcie nástroju Maven
Maven je nástroj na riadenie projektov, môžeme si pod tým predstaviť:
- riadenie závislostí – sťahovanie potrebných knižníc z repozitárov,
- zostavovanie (build) projektu – patrí sem preprocessing, kompilácia, vytváranie archívu (
jar/war
), testovanie a distribúcia, - vytváranie dokumentácie – reporty, projektová dokumentácia vo forme webstránok atď.,
- uľahčenie komunikácie medzi vývojármi.
Maven je primárne určený pre jazyk Java, či už pre desktopové alebo webové aplikácie.
Inštalácia nástroju Maven
Maven je dostupný zdarma a jeho inštalácia je pomerne jednoduchá:
- stiahnite si archív s binárkou z oficiálnej stránky:
http://maven.apache.org/download.cgi, - archív rozbalte a jeho obsah umiestnite na požadované miesto (napr. do C:\Development\Maven),
- upravte systémové premenné (Ovládací panel – Systém – Rozšírené systémové nastavenia – Spresnenie – Premenné prostredia…):
- pridajte novú premennú
M2_HOME
s cestou k rozbalenému archívu:
M2_HOME=C:\Development\Maven
- do premennej
PATH
pridajte:
PATH=...;%M2_HOME%\bin
- pridajte novú premennú
- správnosť inštalácie overíte z príkazového riadku spustením príkazu (po zmene systémových premenných je potrebný reštart príkazového riadku):
mvn -version
- pozn.: Na beh Mavenu sa vyžaduje JDK (minimálna verzia je uvedená v sekcii „System Requirements“ na stránke s binárkou).
Ako funguje nástroj Maven
Maven je konzolová aplikácia, ktorá má modulárnu architektúru, čo v praxi znamená, že využíva množstvo pluginov. Tieto pluginy robia hlavnú prácu (kompilujú, testujú, vytvárajú dokumentáciu…) a samotný Maven sa stará len o ich dodávanie a spúšťanie.
Informácie, ktoré Maven potrebuje na spúšťanie pluginov zapisujeme do tzv. POM (Project Object Model). POM obsahuje všetky potrebné informácie o projekte (o zdrojovom kóde, o závislostiach na externých knižniciach, o popise buidovania…).
Konfigurácia vs. konvencie
Maven sa snaží uplatňovať princíp „konvencia nad konfiguráciou„, vďaka čomu:
- užívateľ nie je nútený robiť zdĺhavú konfiguráciu, ale namiesto toho môže využiť predvolené nastavenia (v prípade potreby ich však môže zmeniť),
- užívateľ sa ľahšie orientuje v nových projektoch (nemusí zisťovať veci z konfigurácie, ale riadi sa konvenciami).
Medzi zásadné konvencie patrí pevná štruktúra projektu:
src/main/java
– súbory so zdrojovým kódom (*.java
),src/main/resources
– ostatné súbory (.properties
,.png
…),src/test/java
– súbory so zdrojovým kódom testov (*.java
),src/test/resources
– ostatné súbory určené pre potreby testov,src/target
– výstupnú súbory z buildu,pom.xml
– konfiguračný súbor buildu.
V prípade, že chceme niektoré predvolené nastavenia zmeniť, zapisujeme ich do:
pom.xml
– obsahuje informácie, ktoré sa vzťahujú len k danému projektu (nachádza sa v koreňovom priečinku projektu),settings.xml
– všeobecné nastavenia Mavenu (nachádza sa v priečinku%M2_HOME%/conf
alebo v%HOMEPATH%/.m2
).
POM (Project Object Model)
POM obsahuje popis projektu, reprezentovaný je XML dokumentom pom.xml
v koreňovom priečinku projektu:
- obsahuje 4 základné časti:
- základné elementy,
- nastavenia buildu,
- metadáta projektu,
- nastavenia prostredia,
- minimálny obsah POM (spraví build, zabalí aplikáciu do
jar
a spustí testy) vyzerá takto:
<project> <modelVersion>4.0.0</modelVersion> <!-- verzia XML schémy pre štruktúru POM --> <groupId>sk.tomasfabry</groupId> <!-- skupina/tím/organizácia, ktorá projekt vytvorila --> <artifactId>demo-project</artifactId> <!-- unikátny identifikátor projektu --> <version>1.2.5-alpha</version> <!-- verzia, nepublikované sú označené ako SNAPSHOT --> </project>
- ostatné hodnoty sa zvyčajne zdedia zo SuperPOM, ktorý obsahuje preddefinované nastavenia, pozri:
https://maven.apache.org/ref/3.0.4/maven-model-builder/super-pom.html - podrobnejší popis:
<!-- koreňový element --> <project> <!-- verzia XML schémy pre štruktúru POM --> <modelVersion>4.0.0</modelVersion> <!-- základné elementy --> <groupId>...</groupId> <artifactId>...</artifactId> <version>...</version> <packaging>typ artefaktu, ktorý projekt vyprodukuje, predvolený je jar</packaging> <dependencies>definície závislostí</dependencies> <parent>rodičovské POM</parent> <dependencyManagement>...</dependencyManagement> <modules>moduly projektu</modules> <properties>definícia vlastných premenných</properties> <!-- nastavenia buildu --> <build>...</build> <reporting>konfigurácia pre reporty</reporting> <!-- metadáta projektu --> <name>meno projektu používané v dokumentácii</name> <description>popis projektu použitý v dokumentácii</description> <url>URL projektu, použité v dokumentácii</url> <inceptionYear>rok založenia projektu</inceptionYear> <licenses>licencia projektu</licenses> <organization>organizácia</organization> <developers>vývojári projektu, ktorí sa priamo podieľajú na vývoji kódu</developers> <contributors>prispievatelia, ktorí sa priamo nepodieľajú na vývoji kódu</contributors> <!-- nastavenia prostredia --> <issueManagement>...</issueManagement> <ciManagement>management kontinuálnej integrácie</ciManagement> <mailingLists>...</mailingLists> <scm>konfigurácia SCM</scm> <prerequisites>popis predpokladov prostredia</prerequisites> <repositories>definície úložísk</repositories> <pluginRepositories>definície úložísk pre pluginy</pluginRepositories> <distributionManagement>konfigurácia vzdialeného úložiska na distribúciu</distributionManagement> <profiles>profily</profiles> </project>
Premenné v POM
V rámci POM môžeme používať premenné, ich názov je uvedený dolárom a uzatvorený v zložených zátvorkách: ${premenná}
.
Rozlišujeme tieto druhy premenných:
- projektové premenné – na každý element z POM môžeme odkazovať ako na premennú:
${project.artifactId}
- premenné s nastaveniami – podobne môžeme odkazovať na elementy zo
settings.xml
:
${settings.offline}
- premenné prostredia – premenné z prostredia OS:
${env.PATH}
- systémové premenné – všetky premenné, ktoré sú dostupné cez
java.lang.System.getProperties()
:
${user.home}
- vlastné premenné – vlastné premenné definované v
pom.xml
alebosettings.xml
v sekcii<properties>
:<project> ... <properties> <junit.version>4.11</junit.version> </properties> ... <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> </dependency> </dependencies> </project>
Pluginy
Maven vykonáva všetku prácu prostredníctvom pluginov. Každý plugin má jeden alebo viac účelov, tzv. cieľov (goals). Cieľ potom predstavuje jednotku práce. Príkladom môže byť plugin Jar, ktorý má ciele na vytvorenie jar
súboru.
Prehľad dostupných pluginov nájdeme na oficiálnych stránkach:
https://maven.apache.org/plugins
Užívateľ má možnosť vytvárať si aj vlastné pluginy pre špecifické úlohy.
Pluginy môžeme spúšťať z príkazového riadku príkazom (<plugin>
predstavuje názov pluginu a <goal>
volaný cieľ):
mvn <plugin>:<goal>
Napr. kompiláciu projektu spustíme:
mvn compiler:compile
Životný cyklus
Životný cyklus je sekvencia fáz. Každá fáza môže mať na seba napojený jeden alebo viac cieľov (ak cieľ nemá, nevykoná sa). Maven má tri vstavené životné cykly:
clean
– vykonáva čistenie projektu, má tri fázy:pre-clean
– procesy pred čistením projektu,clean
– odstráni súbory z predošlých buildov,post-clean
– procesy po čistení projektu,
default
– obsahuje vyše 20 fáz (podrobne na maven.apache.org), najpoužívanejšie sú:validate
– overí správnosť a dostupnosť informácii o projekte,compile
– skompiluje zdrojový kód,test
– spustí testy,package
– zabalí zdrojový kód do archívu na distribúciu (napr. jar alebo war),integration-test
– spracuje distribučný archív, nasadí ho na integračné prostredie a spustí integračné testy,verify
– overí, že archív je valídny,install
– nainštalujte archív do lokálneho úložiska,deploy
– nainštaluje archív do vzdialeného úložiska,
site
– generuje dokumentáciu (vo forme webstránky), má štyri fázy:pre-site
– procesy pred generovaním dokumentácie,site
– vygeneruje projektovú dokumentáciu,post-site
– procesy po generovaní dokumentácie, príprava miesta na nasadenie,site-deploy
– nasadenie stránky s dokumentáciou na zadaný webový server.
Jednotlivé fázy môžeme volať aj priamo, predchádzajúce fázy sa vykonajú automaticky. Napr. fázu install
spustíme príkazom:
mvn install
Môžeme spustiť aj viacero fáz z rôznych cyklov za sebou, napr.:
mvn clean install
Plugin Archetype
Archetyp je šablóna, podľa ktorej Maven vygeneruje nový projekt (s určitou štruktúrou, súbormi či nastaveniami). Užívateľovi je tak umožnené rýchle založenie konkrétneho typu projektu bez zdĺhavej konfigurácie.
Na vygenerovanie projektu z archetypu sa používa rovnomenný plugin Archetype, konkrétne jeho cieľ generate
s nasledujúcimi parametrami:
groupId
,artifactId
,version
– použije sa v POM,packageName
– ak sa nezadá, zoberie sa zgroupId
,archetypeGroupId
–groupId
archetypu, ktorý bude použitý pri vygenerovaní projektu,archetypeArtifactId
–artifactId
archetypu, ktorý bude použitý pri vygenerovaní projektu,archetypeVersion
– verzia archetypu, ktorý bude použitý pri vygenerovaní projektu,interactiveMode
– v interaktívnom móde (implicitne, hodnotatrue
) užívateľ zadáva vyššie uvedené parametre postupne, v opačnom prípade (hodnotafalse
) sa berú z príkazového riadku.
Príklad s použitím základnej šablóny maven-archetype-quickstart
:
mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
Zoznam archetypov na oficiálnych stránkach:
https://maven.apache.org/archetypes
Profily
Pri vývoji niekedy existuje viacero prostredí, na ktoré sa aplikácia nasadzuje (vývojárske, testovacie, produkčné…). Profily umožňujú prispôsobiť nastavenia buildu určitému prostrediu (napr. vymeníme databázu).
Profily v POM definujeme v sekcii <profiles>
, ktorá môže obsahovať jeden alebo viac profilov <profile>
. Každý profil musí mať svoje unikátne ID definované v elemente <id>
.
Profil aktivujeme pomocou argumentu -P<id_profilu>
v príkazovom riadku, napr.:
mvn install -Pproduction
Informácie o profiloch si môžeme vypísať pomocou príkazu:
mvn help:active-profiles
Príklad POM s profilami:
<project> ... <profiles> <profile> <id>...</id> <build> <defaultGoal>...</defaultGoal> <finalName>...</finalName> <resources>...</resources> <testResources>...</testResources> <plugins>...</plugins> </build> <reporting>...</reporting> <modules>...</modules> <dependencies>...</dependencies> <dependencyManagement>...</dependencyManagement> <distributionManagement>...</distributionManagement> <repositories>...</repositories> <pluginRepositories>...</pluginRepositories> <properties>...</properties> </profile> </profiles> </project>
Logovanie
Maven poskytuje tri úrovne logovania, ovládajú sa pomocou nasledujúcich parametrov:
-e
alebo--errors
– používa sa na diagnostiku chýb v Mavene,-X
alebo--debug
– vypisuje všetky logovacie správy (používa sa pri hľadaní chýb v nastaveniach Mavenu),-q
alebo--quiet
– vypisuje len chyby alebo problémy.
Zdroje
- Lucie Tvrdíková: Popište a porovnejte nástroje Maven a Gradle (7. 10. 2016)
- Wikipedia: Apache Maven (10. 10. 2016)