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;


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow