Apache Maven
Maak een Maven-plug-in
Zoeken…
Invoering
Met Maven kunt u aangepaste plug-ins implementeren en gebruiken. Met deze plug-ins kan extra gedrag worden gebonden aan elke fase van de Maven-levenscyclus.
Elk Maven-doel wordt gemaakt door het implementeren van een MOJO (Maven Ordinary Java Object): een Java-klasse geïmplementeerd met annotaties die beschrijft hoe deze kan worden opgeroepen.
Het doelvoorvoegsel van een plug-in is afgeleid van de artefactnaam. Een artefact hello-world-plugin
creëert een doelprefix hello-world
. Het hello
doel kan dan worden uitgevoerd met mvn hello-world:hello
.
Opmerkingen
Een Maven-plug-in is een JAR met een maven/plugins.xml
plug- maven/plugins.xml
die de metagegevens van de plug-in beschrijft. Dit bestand wordt gegenereerd door de maven-plugin-plugin
.
Een Maven-artefact verklaren als een Maven-plug-in
Een artefact gebouwd door Maven kan worden verklaard als een Maven-plug-in door de verpakking op te geven als maven-plugin
in in de pom.xml
.
<packaging>maven-plugin</packaging>
U moet een afhankelijkheid van de plug-in-API en annotaties aangeven.
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-plugin-api</artifactId>
<version>3.3.9</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.maven.plugin-tools</groupId>
<artifactId>maven-plugin-annotations</artifactId>
<version>3.5</version>
<scope>provided</scope>
</dependency>
U moet een plug-in toevoegen om de metagegevens te genereren.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-plugin-plugin</artifactId>
<version>3.5</version>
</plugin>
Een doel creëren
Doelen worden geïmplementeerd door een MOJO te maken. Dit is een klassebestand geannoteerd met annotaties van maven-plugin-annotations
.
@Mojo(name = "hello")
public final class HelloWorldMojo extends AbstractMojo {
public void execute() throws MojoExecutionException, MojoFailureException {
getLog().info("Hello world");
}
}
Plug-inconfiguratie gebruiken
Plug-ins kunnen worden geconfigureerd door velden te annoteren met @Parameter
. De MOJO wordt vervolgens geïnjecteerd met de configuratie.
@Mojo(name = "greet")
public final class GreetMojo extends AbstractMojo {
@Parameter(required = true)
public String name;
public void execute() throws MojoExecutionException, MojoFailureException {
getLog().info("Hello " + name);
}
}
De name
parameter kan in de POM worden geconfigureerd:
<plugin>
<groupId>com.mattunderscore</groupId>
<artifactId>hello-world-plugin</artifactId>
<version>1.0-SNAPSHOT</version>
<configuration>
<name>Matt</name>
</configuration>
</plugin>
Als de greet
doel wordt uitgevoerd als een standalone doel de name
parameter kan worden gedefinieerd als woning op de opdrachtregel:
mvn <plugin name>:greet -Dname=Geri
Toegang tot de projectinformatie
De plug-in heeft onder andere toegang tot informatie over het huidige Maven-project dat wordt gebouwd.
@Mojo(name = "project")
public final class ProjectNameMojo extends AbstractMojo {
@Parameter(defaultValue = "${project}", readonly = true, required = true)
private MavenProject project;
public void execute() throws MojoExecutionException, MojoFailureException {
getLog().info("Hello, this is " + project.getName());
}
}
In het bovenstaande voorbeeld wordt in de console de naam afgedrukt van het Maven-project waarop het wordt uitgevoerd, dat is opgegeven in het element <project>/<name>
van de bijbehorende POM.
De klasse MavenProject
die in de plug-in wordt gebruikt, vereist een afhankelijkheid van maven-core
met een (standaard) compile
in de POM van de plug-in:
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-core</artifactId>
<version>3.3.9</version>
</dependency>
Verder vereist het gebruik van annotaties de volgende afhankelijkheid in de POM van de plug-in:
<dependency>
<groupId>org.apache.maven.plugin-tools</groupId>
<artifactId>maven-plugin-annotations</artifactId>
<version>3.5</version>
<scope>provided</scope> <!-- annotations are needed only to build the plugin -->
</dependency>
Declareer een standaardfase voor een doel
@Mojo(name = "hi", defaultPhase = LifecyclePhase.COMPILE)
Download de build-map als een bestand
@Parameter(defaultValue = "${project.build.directory}")
private File buildDirectory;