Pořádek v multi-module buildu
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> |
| <?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> |
Celý miniprojekt na githubu.
