Domů » Informatika » Nástroje » Maven

Maven

Maven je rozšířený systém pro správu a sestavování aplikací postavených nad platformou Java. Jeho využitím odpadá závislost na konkrétním IDE, protože všechny informace potřebné ke kompilaci a sestavení programu jsou přímo obsaženy ve speciálních souborech pom.xml. Systém Maven je již plně integrován do všech velkých IDE (Eclipse, Netbeans, IDEA) a tak je práce s ním opravdu velmi snadná i přes GUI.

Princip

Principem systému Maven je vytvoření objektového modelu nad zdrojovým kódem, se kterým lze provádět různé operace. Nejčastěji se jedná o kompilaci, kontrolu, vytvoření balíků, atd. Model projektu je definován v souborech pom.xml, které se nachází v kořenovém adresáři každého projektu. V těchto adresářích lze spouštět příkazy mvn s parametry, které načtou model z odpovídajícího souboru pom.xml a provedou zadanou akci.

Klíčovou funkcí systému Maven je řešení závislostí. To znamená, že není nutné ručně kopírovat knihovny (JAR, WAR, EAR) a umisťovat je na classpath. Zvláště u velkých projektů složených z mnoha podprojektů je to neocenitelné zpřehlednění a zjednodušení vývoje.

Projekt

Každý soubor pom.xml představuje jeden projekt (v hantýrce Maven artefakt). Artefakt je jednoznačně identifikován skupinou (groupId), názvem (artifactId) a verzí (version).

Repositář

Repositář systému Maven obsahuje katalog artefaktů a systém pro jejich vyhledávání a stahování. Repositáře jsou lokální a vzdálené. Lokální repositář je vždy přítomen na vašem lokálním počítači a cachují se v něm použité závislosti. Není tedy nutné při každé kompilaci stahovat balíčky ze vzdáleného repositáře. Výchozím centrálním repositáře je http://search.maven.org/, ale konfigurací Mavenu či POM lze nastavit jiný (například firemní či týmový).

Závislosti (Dependencies)

Závislostmi jsou myšlené jiné artefakty spravované systémem Maven, které nějaký artefakt vyžaduje ke své kompilaci či funkci. Závislosti mají tzv. scope, který specifikuje míru a okamžik potřeby dané závislosti. Scope může nabývat následujících hodnot:

  • compile (výchozí) = artefakt je vyžadován pro kompilaci i běh aplikace (artefakt bude dostupný na všech classpath)
  • test = artefakt je vyžadován pouze pro kompilaci a spuštění unit testů
  • runtime = artefakt není vyžadován při komplikaci, ale je vyžadován za běhu aplikace (nejčastěji implementace různých API)
  • provided = artefakt je vyžadován pro komplikaci i běh, ale bude poskytnut JVM za běhu (nejčastěji různé knihovny přibalené v aplikačním serveru)
  • system = podobný jako provided, ale je nutné ručně uvést cestu k zadanému artefaktu
  • import
Příklad

kód v jazyce XML - Zobrazit jako TXT, HTML, HTML (okno)

  1. <dependency>
  2.   <groupId>somegroup</groupId>
  3.   <artifactId>someartifact</artifactId>
  4.   <version>1.0</version>
  5.   <scope>provided</scope>
  6. </dependency>

Spravované závislosti (Managed Dependencies)

Správa závislostí se používá ve vícemodulových projektech a slouží ke sjednocení použitých verzí. Nadřazený projekt například může specifikovat verzi určité závislosti a podřazené projekty tuto verzi již uvádět nemusí (avšak mohou ji přebít, pokud chtějí).

Příklad
Nadřazený projekt

kód v jazyce XML - Zobrazit jako TXT, HTML, HTML (okno)

  1. <dependencyManagement>
  2.   <dependency>
  3.     <groupId>somegroup</groupId>
  4.     <artifactId>someartifact</artifactId>
  5.     <version>1.0</version>
  6.     <scope>provided</scope>
  7.   </dependency>
  8. </dependencyManagement>
Podřazený projekt

kód v jazyce XML - Zobrazit jako TXT, HTML, HTML (okno)

  1. <dependency>
  2.   <groupId>somegroup</groupId>
  3.   <artifactId>someartifact</artifactId>
  4.   <!-- není nutné specifikovat verzi -->
  5. </dependency>

Výjimky ze závislostí (Dependency Exclusions)

TODO

Volitelné závislosti (Optional Dependencies)

TODO

Soubor pom.xml

Soubor pom.xml (POM = project object model) je XML soubor obsahující model jednoho artefaktu (projektu), který obsahuje například závislosti artefaktu a jeho návaznosti na jiné artefakty.

Příklady
Jednoduchý projekt se závislostí

kód v jazyce XML - Zobrazit jako TXT, HTML, HTML (okno)

  1. <project
  2.   xmlns="http://maven.apache.org/POM/4.0.0"
  3.   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5.  
  6.   <modelVersion>4.0.0</modelVersion>
  7.   <groupId>cz.voho</groupId>
  8.   <artifactId>myproject</artifactId>
  9.   <version>1.0.0-SNAPSHOT</version>
  10.   <packaging>jar</packaging>
  11.   <name>My Project</name>
  12.   <description>Sample project with a dependency</description>
  13.   <url>http://someproject.com/</url>
  14.   <inceptionYear>2000</inceptionYear>
  15.  
  16.   <dependencies>
  17.     <dependency>
  18.       <groupId>com.company</groupId>
  19.       <artifactId>somelibrary</artifactId>
  20.       <version>1.2.3</version>
  21.     </dependency>
  22.   </dependencies>
  23.  
  24. </project>
Hlavní projekt s moduly

kód v jazyce XML - Zobrazit jako TXT, HTML, HTML (okno)

  1. <project
  2.   xmlns="http://maven.apache.org/POM/4.0.0"
  3.   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5.  
  6.   <modelVersion>4.0.0</modelVersion>
  7.   <groupId>cz.voho</groupId>
  8.   <artifactId>myproject</artifactId>
  9.   <version>1.0.0-SNAPSHOT</version>
  10.   <packaging>pom</packaging>
  11.   <name>My Project</name>
  12.   <description>Sample parent project with modules</description>
  13.   <url>http://someproject.com/</url>
  14.   <inceptionYear>2000</inceptionYear>
  15.  
  16.   <modules>
  17.     <module>module1</module>
  18.     <module>module2</module>
  19.     <module>module3</module>
  20.   </modules>
  21.  
  22. </project>

Spuštění kompilace

Maven se spouští příkazem mvn v adresáři, který obsahuje soubor pom.xml. Za příkazem mvn následují tzv. goaly a parametry.

kód v jazyce BASH - Zobrazit jako TXT, HTML, HTML (okno)

  1. mvn [goaly] [parametry]

Nejčastěji používané parametry:

  • -U = aktualizovat snapshoty (nahraje z repositáře jejich aktuální verze)
  • -O = offline režim (používá pouze artefakty z lokálního repositáře)
  • -DskipTests=true = přeskočí unit testy
  • -T4 = použít 4 vlákna
Příklady

Smazat všechny výstupní soubory (clean), zkompilovat a instalovat projekt do lokálního repositáře (install) a přitom aktualizovat všechny závislosti, jejichž verze jsou snapshoty (-U). To všechno provést ve čtyřech vláknech (-T4):

kód v jazyce BASH - Zobrazit jako TXT, HTML, HTML (okno)

  1. mvn clean install -U -T4

Příklad použití:

kód v jazyce BASH - Zobrazit jako TXT, HTML, HTML (okno)

  1. mvn clean install -UOT4

Vypsat seznam závislostí, které mají v repositáři novější verzi:

kód v jazyce BASH - Zobrazit jako TXT, HTML, HTML (okno)

  1. mvn versions:display-dependency-updates

Vypsat seznam Maven pluginů, které mají v repositáři novější verzi:

kód v jazyce BASH - Zobrazit jako TXT, HTML, HTML (okno)

  1. mvn versions:display-plugin-updates

Aktualizovat všechny závislosti na další (next) či poslední verze (latest):

kód v jazyce BASH - Zobrazit jako TXT, HTML, HTML (okno)

  1. mvn versions:use-next-releases
  2. mvn versions:use-latest-releases
  3. mvn versions:use-next-snapshots
  4. mvn versions:use-latest-snapshots

Vypsat nepoužívané a tranzitivní závislosti:

kód v jazyce BASH - Zobrazit jako TXT, HTML, HTML (okno)

  1. mvn dependency:analyze

Běžné případy užití

Webové služby JAX-WS

Plugin JAX-WS se používá pro vytváření klientů webových služeb a generování souvisejícího zdrojového kódu dle souboru WSDL. Nejprve je třeba přidat závislost na Java EE web API:

kód v jazyce Java - Zobrazit jako TXT, HTML, HTML (okno)

  1. <dependencies>
  2.   <dependency>
  3.     <groupId>javax</groupId>
  4.     <artifactId>javaee-web-api</artifactId>
  5.     <version>XXX</version>
  6.     <scope>provided</scope>
  7.   </dependency>
  8. </dependencies>

Poté je již možné konfigurovat plugin a jeho spuštění při kompilaci. Následující příklad připraví kód pro provolání vzdálené webové služby.

kód v jazyce XML - Zobrazit jako TXT, HTML, HTML (okno)

  1. <plugin>
  2.   <groupId>org.jvnet.jax-ws-commons</groupId>
  3.   <artifactId>jaxws-maven-plugin</artifactId>
  4.   <version>2.2</version>
  5.   <executions>
  6.     <execution>
  7.       <goals>
  8.         <goal>wsimport</goal>
  9.       </goals>
  10.       <configuration>
  11.         <wsdlFiles>
  12.           <wsdlFile>www.webservicex.net/EMBLNucleotideSequenceWebService.asmx.wsdl</wsdlFile>
  13.         </wsdlFiles>
  14.         <wsdlLocation>http://www.webservicex.net/EMBLNucleotideSequenceWebService.asmx?WSDL</wsdlLocation>
  15.       </configuration>
  16.       <id>wsimport-generate-EMBLNucleotideSequenceWebService.asmx</id>
  17.       <phase>generate-sources</phase>
  18.     </execution>
  19.   </executions>
  20.   <dependencies>
  21.     <dependency>
  22.       <groupId>javax.xml</groupId>
  23.       <artifactId>webservices-api</artifactId>
  24.       <version>1.4</version>
  25.       </dependency>
  26.     </dependencies>
  27.   <configuration>
  28.     <xnocompile>true</xnocompile>
  29.     <verbose>true</verbose>
  30.     <extension>true</extension>
  31.   </configuration>
  32. </plugin>

Do sekce configuration je dále možné přidat tyto tagy:

  • packageName – obsahuje název balíčku, ve kterém budou vygenerované soubory umístěny
  • encoding – název kódování generovaných souborů (např. utf-8)
  • verbose – zapne (true) či vypne (false) podrobné logování generátoru

Reference