Apache Maven
Crea un plugin Maven
Ricerca…
introduzione
Maven ti consente di implementare e utilizzare plug-in personalizzati. Questi plug-in consentono di associare comportamenti aggiuntivi a qualsiasi fase del ciclo di vita di Maven.
Ogni obiettivo Maven viene creato implementando un MOJO (Maven Ordinary Java Object): una classe Java implementata con annotazioni che descrivono come richiamarla.
Il prefisso obiettivo di un plugin deriva dal suo nome di artefatto. Un artefatto hello-world-plugin
crea un prefisso obiettivo hello-world
. L'obiettivo hello
può quindi essere eseguito con mvn hello-world:hello
.
Osservazioni
Un plugin Maven è un JAR contenente un maven/plugins.xml
che descrive i metadati del plugin. Questo file è generato dal maven-plugin-plugin
.
Dichiarare un artefatto Maven come plugin Maven
Un artefatto costruito da Maven può essere dichiarato come plugin Maven specificando la confezione come maven-plugin
nel pom.xml
.
<packaging>maven-plugin</packaging>
Devi dichiarare una dipendenza dall'API e dalle annotazioni del plugin.
<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>
Devi aggiungere un plugin per generare i metadati.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-plugin-plugin</artifactId>
<version>3.5</version>
</plugin>
Creare un obiettivo
Gli obiettivi vengono implementati creando un MOJO. Questo è un file di classe annotato con annotazioni da maven-plugin-annotations
.
@Mojo(name = "hello")
public final class HelloWorldMojo extends AbstractMojo {
public void execute() throws MojoExecutionException, MojoFailureException {
getLog().info("Hello world");
}
}
Utilizzando la configurazione del plugin
I plugin possono essere configurati annotando i campi con @Parameter
. Il MOJO viene quindi iniettato con la configurazione.
@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);
}
}
Il parametro name
può essere configurato nel POM:
<plugin>
<groupId>com.mattunderscore</groupId>
<artifactId>hello-world-plugin</artifactId>
<version>1.0-SNAPSHOT</version>
<configuration>
<name>Matt</name>
</configuration>
</plugin>
Se l'obiettivo di greet
viene eseguito come obiettivo autonomo, il parametro name
può essere definito come proprietà sulla riga di comando:
mvn <plugin name>:greet -Dname=Geri
Accedere alle informazioni del progetto
Il plugin può, tra l'altro, accedere alle informazioni sull'attuale progetto Maven in fase di costruzione.
@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'esempio precedente dovrebbe stampare nella console il nome del progetto Maven su cui viene eseguito, che è specificato nell'elemento <project>/<name>
del suo POM.
La classe MavenProject
utilizzata nel plugin richiede una dipendenza di maven-core
con un ambito di compile
(predefinito) nel POM del plugin:
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-core</artifactId>
<version>3.3.9</version>
</dependency>
Inoltre, l' uso delle annotazioni richiede la seguente dipendenza nel POM del 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>
Dichiarare una fase predefinita per un obiettivo
@Mojo(name = "hi", defaultPhase = LifecyclePhase.COMPILE)
Ottieni la directory di build come un file
@Parameter(defaultValue = "${project.build.directory}")
private File buildDirectory;