Chris Nygaard (by-nc-nd 2.0)

Mám rád v dílně pořádek. Všechno má své místo, na které se musí vracet. Nářadí nesmíte dlouze hledat či o něj dokonce zakopávat. Nejlépe je uklízet hned a málo, než později a hodně, protože se vám do toho nebude chtít. Stejně to mám rád při programování. Mohl bych psát o víc sexy nástrojích jako Gradle, ale nejde si nevšimnout, že mnozí programátoři (ať už z nezájmu nebo nedostatku kázně) mají herberk i v hojně rozšířeném Mavenu. Chtěl bych ukázat, jak lze mít uklizeno v multi-module buildu. Jestli to zrovna vy nepotřebujete, tím lépe.

Multi-module build

Nebudu popisovat, co to multi-module build je. Zaměřím se na několik nešvarů, se kterými jsem se setkal.

Předně v modulu nemusíte uvádět groupId ani verzi, převezme se z parenta, stačí pouze artifactId. Pochopitelně je můžete překrýt, ale máte k tomu důvod? Dost si takhle usnadníte třeba release.

Veškeré závislosti uvádějte v parentu v dependencyManagementu a ne rovnou v dependencies, ať se vám nerozjedou verze. Potřebuje-li pak nějaký modul konkrétní závislost, uvede v dependencies pouze groupId a artifactId. Verzi řídí parent pro všechny moduly.

Stejně jako lze mít uklizeno v dependencies, lze uklidit i v pluginech. Ukažme si to na příkladu compiler pluginu. Pro určité packagingy tam je automaticky namapovaný, ale nejspíš budete potřebovat změnit target a source na něco vyššího než 1.5 Bylo by, když ne chybou, tak určitě neelegantní, definovat plugin přímo v parentu a nutit ho tak všem modulům, i těm, které ho vzhledem ke svému packagingu nepotřebují. Lze to vylepšit tak, že plugin definujete v pluginManagementu podobně jako závislosti v dependencyManagementu.

Ve všech těch parentech a transitivních závislostech se člověk snadno ztratí, takže můžete nakonec ověřit konfiguraci modulu pomocí mvn help:effective-pom

BOM (bill of materials) a releasování si nechám na příště.

Ukázka

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>parent</artifactId>
<groupId>cz.zvestov.mvn-multimodule-sample</groupId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<artifactId>web</artifactId>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>cz.zvestov.mvn-multimodule-sample</groupId>
<artifactId>core</artifactId>
</dependency>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-web-api</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.6</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
</plugins>
</build>
</project>
view raw pom-module.xml hosted with ❤ by GitHub
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cz.zvestov.mvn-multimodule-sample</groupId>
<artifactId>parent</artifactId>
<packaging>pom</packaging>
<version>1.0.0-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.source.version>1.7</java.source.version>
<java.target.version>1.7</java.target.version>
</properties>
<modules>
<module>api</module>
<module>core</module>
<module>web</module>
</modules>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>cz.zvestov.mvn-multimodule-sample</groupId>
<artifactId>api</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>cz.zvestov.mvn-multimodule-sample</groupId>
<artifactId>core</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-web-api</artifactId>
<version>7.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${java.source.version}</source>
<target>${java.target.version}</target>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
view raw pom-parent.xml hosted with ❤ by GitHub

Celý miniprojekt na githubu.

Anketa

Co používáte za build nástroj

Související