Apache Maven
Créer un plugin Maven
Recherche…
Introduction
Maven vous permet d'implémenter et d'utiliser des plugins personnalisés. Ces plug-ins permettent à un comportement supplémentaire d'être lié à n'importe quelle phase du cycle de vie de Maven.
Chaque objectif Maven est créé en implémentant un objet Java MOJO (Maven Ordinary Java Object): une classe Java implémentée avec des annotations qui décrivent comment l'invoquer.
Le préfixe d'objectif d'un plugin est dérivé de son nom d'artefact. Un hello-world-plugin
artefact hello-world-plugin
crée un préfixe d'objectif hello-world
. Le but hello
peut alors être exécuté avec mvn hello-world:hello
.
Remarques
Un plugin Maven est un JAR contenant un maven/plugins.xml
qui décrit les métadonnées du plugin. Ce fichier est généré par le maven-plugin-plugin
.
Déclarer un artefact Maven en tant que plugin Maven
Un artefact construit par Maven peut être déclaré en tant que plug-in Maven en spécifiant le maven-plugin
comme maven-plugin
dans le pom.xml
.
<packaging>maven-plugin</packaging>
Vous devez déclarer une dépendance à l'API du plug-in et aux annotations.
<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>
Vous devez ajouter un plug-in pour générer les métadonnées.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-plugin-plugin</artifactId>
<version>3.5</version>
</plugin>
Créer un objectif
Les objectifs sont mis en œuvre en créant un MOJO. Ceci est un fichier de classe annoté avec des annotations de maven-plugin-annotations
.
@Mojo(name = "hello")
public final class HelloWorldMojo extends AbstractMojo {
public void execute() throws MojoExecutionException, MojoFailureException {
getLog().info("Hello world");
}
}
Utiliser la configuration du plugin
Les plugins peuvent être configurés en annotant des champs avec @Parameter
. Le MOJO est ensuite injecté avec la configuration.
@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);
}
}
Le paramètre name
peut être configuré dans le POM:
<plugin>
<groupId>com.mattunderscore</groupId>
<artifactId>hello-world-plugin</artifactId>
<version>1.0-SNAPSHOT</version>
<configuration>
<name>Matt</name>
</configuration>
</plugin>
Si l'objectif greet
est exécuté en tant qu'objectif autonome, le paramètre name
peut être défini en tant que propriété sur la ligne de commande:
mvn <plugin name>:greet -Dname=Geri
Accéder aux informations du projet
Le plug-in peut, entre autres, accéder à des informations sur le projet Maven en cours de construction.
@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());
}
}
L'exemple ci-dessus imprimera dans la console le nom du projet Maven sur lequel il est exécuté, qui est spécifié dans l'élément <project>/<name>
de son POM.
La classe MavenProject
utilisée dans le plugin nécessite une dépendance de maven-core
avec une étendue de compile
(par défaut) dans le POM du plugin:
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-core</artifactId>
<version>3.3.9</version>
</dependency>
De plus, l' utilisation des annotations nécessite la dépendance suivante dans le POM du plugin:
<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>
Déclarez une phase par défaut pour un objectif
@Mojo(name = "hi", defaultPhase = LifecyclePhase.COMPILE)
Récupère le répertoire de construction en tant que fichier
@Parameter(defaultValue = "${project.build.directory}")
private File buildDirectory;