Základní pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cz.example</groupId>
<artifactId>fakturace</artifactId>
<version>1.4.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>Fakturace</name>
<properties>
<maven.compiler.release>21</maven.compiler.release>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<junit.version>5.11.0</junit.version>
</properties>
<dependencies>
<dependency>
<groupId>jakarta.xml.bind</groupId>
<artifactId>jakarta.xml.bind-api</artifactId>
<version>4.0.2</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.5.0</version>
</plugin>
</plugins>
</build>
</project> -
<project>má výchozí jmenný prostorhttp://maven.apache.org/POM/4.0.0a odkaz na XSD, podle kterého IDE kontroluje a doplňuje prvky. -
groupId,artifactIdaversionjsou souřadnice — jednoznačně identifikují projekt v repozitáři. Verze s příponou-SNAPSHOTumožňuje průběžně aktualizovat obsah pod stejnou verzí. Verze bez této přípony se používá pro vydání, která mají zůstat neměnná; samotný zápis verze však přepsání v repozitáři nezabrání. -
packagingurčuje výstup:jar,war, nebopomu rodičovských projektů. -
propertiesjsou proměnné použitelné jako${junit.version}; některé (kódování, verze Javy) čtou přímo pluginy.
Závislosti a jejich rozsah
Každá <dependency> má souřadnice knihovny a volitelně scope,
který říká, kdy je knihovna potřeba:
| scope | Kdy je knihovna k dispozici |
|---|---|
| compile (výchozí) | při překladu, testech i běhu; přenáší se na závislé projekty |
| provided | při překladu a testech; za běhu ji dodá server (např. Servlet API) |
| runtime | jen za běhu a v testech (např. JDBC ovladač) |
| test | jen při překladu a spuštění testů |
| import | jen v dependencyManagement u typu pom: převezme verze z BOM |
Maven stahuje i závislosti závislostí (tranzitivní). Nechtěnou knihovnu vyřadíš prvkem
<exclusions> a celý strom si vypíšeš příkazem mvn dependency:tree.
Rodičovský POM a moduly
Větší projekty často sdílejí rodičovský POM s verzemi v
dependencyManagement. Dědění přes parent a společné sestavení přes modules
jsou dvě různá nastavení; jeden POM může plnit obě role. Modul může vynechat verzi
závislosti, pokud ji získá z odpovídajícího dependencyManagement:
<!-- rodičovský pom.xml (packaging pom) -->
<project xmlns="http://maven.apache.org/POM/4.0.0">
<modelVersion>4.0.0</modelVersion>
<groupId>cz.example</groupId>
<artifactId>platforma</artifactId>
<version>2.0.0</version>
<packaging>pom</packaging>
<modules>
<module>fakturace</module>
<module>sklad</module>
</modules>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.7.4</version>
</dependency>
</dependencies>
</dependencyManagement>
</project> <!-- fakturace/pom.xml -->
<project xmlns="http://maven.apache.org/POM/4.0.0">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>cz.example</groupId>
<artifactId>platforma</artifactId>
<version>2.0.0</version>
</parent>
<artifactId>fakturace</artifactId>
<dependencies>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<!-- verze se převezme z dependencyManagement rodiče -->
</dependency>
</dependencies>
</project> dependencyManagement knihovny nepřidává — jen předepisuje verzi pro případ, že
ji některý modul použije. Samotné přidání je vždy v dependencies.
Profily
Profil přepíná nastavení podle prostředí; aktivuje se parametrem, proměnnou nebo verzí JDK:
<profiles>
<profile>
<id>produkce</id>
<properties>
<db.url>jdbc:postgresql://db.example.cz/fakturace</db.url>
</properties>
</profile>
</profiles>
<!-- aktivace: mvn package -P produkce --> Dotazy XPath na pom.xml
Kvůli výchozímu jmennému prostoru dotaz /project/version nic nenajde. V XPath 1.0
(skripty, CI, xmllint --xpath) pomůže local-name() nebo prefix:
| Dotaz (XPath 1.0) | Co vrátí |
|---|---|
| /*[local-name()='project']/*[local-name()='version'] | verzi projektu |
| //*[local-name()='dependency']/*[local-name()='artifactId'] | názvy všech závislostí |
| //*[local-name()='dependency'][*[local-name()='scope']='test'] | závislosti jen pro testy |
| //m:dependency/m:artifactId (prefix m = http://maven.apache.org/POM/4.0.0) | totéž se zaregistrovaným prefixem |
Pro verzi v CI skriptech je spolehlivější zeptat se samotného Mavenu:
mvn help:evaluate -Dexpression=project.version -q -DforceStdout — vyhodnotí i
proměnné a zděděné hodnoty z rodiče, které v souboru přímo nejsou.
Co Maven skutečně použije při sestavení
mvn help:effective-pom
mvn help:active-profiles
mvn dependency:tree Effective POM ukáže výsledek po dědění a zapojení aktivních profilů. Seznam aktivních profilů vysvětlí, proč se použilo jiné nastavení; strom závislostí ukáže skutečně vybrané knihovny. Úspěšná kontrola XML syntaxe nic z toho neověřuje. Rozdíl mezi děděním a společným sestavením popisuje POM Reference.