Meer met Maven – Multimodule project commandline arguments

In elke editie zal Robert Scholte een probleem voorleggen en deze oplossen met behulp van Apache Maven om meer inzicht te geven in Maven zelf en de vele beschikbare plugins.

Voor wie nu voor het eerst de term “multimodule” ziet, eerst een zeer korte introductie: Met een multimodule project is het mogelijk om je java-project modulair op te zetten, onderlinge afhankelijkheden vast te leggen en met één enkele commando alles te laten bouwen.

Wanneer je werkt vanuit een IDE merk je weinig verschil tussen een standalone project en een multimodule project. Als je gebruik moet maken van de commandline, dan zul je standaard alle modules bouwen. Afhankelijk van de grootte is er soms behoefte om slechts een deel van deze modules te bouwen.

In het –help overzicht van de Maven commandline krijg je onder andere de volgende opties te zien die gerelateerd zijn aan multimodule projecten:

-am,–also-make If project list is specified, also build projects required by the list
-amd,–also-make-dependents

If project list is specified, also build projects that depend on projects on the list

-pl,–projects <arg> Comma-delimited list of specified reactor projects to build instead of all projects. A project can be specified by [groupId]:artifactId or by its relative path.
-rf,–resume-from <arg> Resume reactor from specified project

Met deze opties bepaal je welke modules/subprojecten je wel of juist niet wilt bouwen.

Op internet zijn vele pagina’s te vinden waarbij gesproken over de “reactor” en “reactor projects” in combinatie met multimodule projecten. In dit geval gaat het om de effectief te bouwen modules. Standaard zijn de reactor projects dus gelijk aan alle modules, maar door gebruik te maken van bovenstaande opties beperk je het aantal te bouwen modules. Deze beperkte set vormen tezamen de reactor.

Als een multimodule halverwege faalt, geeft Maven een hint, dat je na herstel van het probleem het project weer kunt uitvoeren met –resume-from. De kans is echter groot, dat deze afhankelijk is van modules die eerder zijn gebouwd. Deze komen echter bij een nieuwe bouwpoging niet voor in de reactor, waardoor deze afhankelijkheden via de local repository zullen worden opgehaald. Als je de vorige keer Maven had uitgevoerd met “install”, dan zijn hoogstwaarschijnlijk de juiste versies beschikbaar. In JavaMagazine editie 3 van 2013 heb ik eerder al beschreven waarom mijn voorkeur naar “verify” uitgaat in plaats van “install”. Door –resume-from uit te breiden met –also-make zorg je ervoor, dat ook de benodigde modules onderdeel uit gaan maken van de reactor. Nu wordt het project gebouwd zoals je zou verwachten.

Met de optie –also-make-dependents zorg je ervoor dat de modules die gebruik maken van één van de reactorprojects (bijvoorbeeld als dependency) ook toegevoegd worden aan de reactor. Je kunt deze -am en -amd opties goed vergelijken met de upstream en downstream projects in Jenkins.

Tot slot kun je met de –projects expliciet kiezen welke projecten gebouwd moeten worden. En ook hier kun je de -am en -amd opties toevoegen.

Nu kan het natuurlijk voorkomen, dat deze projecten niet allemaal gebouwd hoeven te worden. Sinds Maven-3.2.1 is het mogelijk om met een uitroepteken projecten alsnog uit te sluiten, dus bijvoorbeeld –projects !rare-module.

Maven biedt voldoende opties waarmee jij kunt bepalen welke delen van een multimodule project je wilt bouwen. Het is dus niet per definitie “alles of niks”.