Meer met Maven – Maven Plugins and Mojo Parameters

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.

De overzichtspagina van de beschikbare plugins op de website van Apache Maven zegt het heel duidelijk: Maven is – at its heart – a plugin execution framework; all work is done by plugins.”  Er is dus een belangrijke taak weggelegd voor plugins.

Maar laten we bij het begin beginnen: wat is een plugin? Grofweg is het een verzameling taken (goals) die logischerwijs bij elkaar horen. Zo heeft de maven-compiler-plugin twee goals: ‘compile’ voor het compileren van de main javabestanden en ‘testCompile’ voor het compileren van de test javabestanden.

Elke goal kan zijn eigen set aan parameters hebben waarmee je de invoer, uitvoer of het gedrag kunt sturen. Het kan een pom.xml vereisen, maar dat hoeft niet. Het kan zichzelf eventueel koppelen aan een default phase. En zo zijn er meer opties.

1. import org.apache.maven.plugin.AbstractMojo;
2. import org.apache.maven.plugins.annotations.Mojo;
3. import org.apache.maven.plugins.annotations.Parameter;
4.
5. @Mojo( name = "sayhi", requiresProject = false )
6. public class GreetingMojo extends AbstractMojo
7. {
8.     @Parameter( property = ”to”, defaultValue = ”John Doe”, required = true )
9.     private String name;
10.
11.     public void execute()
12.     {
13.         getLog().info( "Hello " + name );
14.     }
15. }
Bovenstaand codevoorbeeld is een heel kort voorbeeld van een Mojo: een stukje code voor een specifieke goal. Mojo komt van Maven POJO (plain old java object), maar het bevat wel iets meer dan alleen getters en setters. Zo ondersteunt het ook CDI met behulp van de @Component annotatie. Nieuwere versies van Maven ondersteunen ook @Inject.

Het bovenstaande stukje code kun je na installeren ( mvn install) als volgt aanroepen:


{groupId}:{artifactId}:sayhi

Aangezien in de plugin staat “requiresProject = false”, hoef je geen pom.xml in de directory te hebben om deze goal aan te roepen. Het resultaat is in dit geval: Hello John Doe

Om de naam in de begroeting aan te passen, kun je een property meegeven:


{groupId}:{artifactId}:sayhi –Dto=”Robert Scholte”

Let op: je kunt dit ook in de pom configureren, maar dan gebruik je de naam/alias van de parameter, oftewel:


<configuration><name>Robert Scholte</name></configuration>

In de gegenereerde plugin documentatie moet je dus altijd goed opletten, welke van de twee je nodig hebt. Vaak zijn ze hetzelfde, maar voor bijvoorbeeld een parameter als skip is het vanaf de commandline niet te bepalen welke goal geskipt moet worden. Vandaar dat daarbij vaak de pluginnaam als prefix gebruikt wordt (bijvoorbeeld: maven.deploy.skip).

Door het in de configuratie een vaste waarde te geven kun je het niet meer via de commandline overschrijven. Er is gelukkig wel een manier om een andere default aan te geven, namelijk via de properties in de pom.xml:


<properties><to>Rockstar Duke</to></properties>

Dit is nog maar een begin voor een Mojo, meer informatie is te vinden op de website van Apache Maven.