Apache Maven

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%\binOkno so systémovými premennými.
  • 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 -versionVýpis príkazu 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>
<!-- 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 alebo settings.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 z groupId,
  • archetypeGroupIdgroupId archetypu, ktorý bude použitý pri vygenerovaní projektu,
  • archetypeArtifactIdartifactId 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, hodnota true) užívateľ zadáva vyššie uvedené parametre postupne, v opačnom prípade (hodnota false) 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

Leave a Reply

Vaša e-mailová adresa nebude zverejnená. Vyžadované polia sú označené *