Buscar..


Introducción

Maven te permite implementar y usar complementos personalizados. Estos complementos permiten vincular el comportamiento adicional a cualquier fase del ciclo de vida de Maven.

Cada objetivo de Maven se crea al implementar un MOJO (Maven Ordinary Java Object): una clase de Java implementada con anotaciones que describe cómo invocarlo.

El prefijo de objetivo de un complemento se deriva de su nombre de artefacto. Un artefacto hello-world-plugin crea un prefijo de objetivo hello-world . El objetivo de hello se puede ejecutar con mvn hello-world:hello .

Observaciones

Un complemento de Maven es un JAR que contiene un maven/plugins.xml que describe los metadatos del complemento. Este archivo es generado por el maven-plugin-plugin .

Declarar un artefacto Maven como un complemento de Maven

Un artefacto construido por Maven puede ser declarado como un plugin Maven especificando el envase como maven-plugin en el pom.xml .

<packaging>maven-plugin</packaging>

Debe declarar una dependencia en la API del complemento y las anotaciones.

<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>

Es necesario agregar un complemento para generar los metadatos.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-plugin-plugin</artifactId>
    <version>3.5</version>
</plugin>

Creando un objetivo

Las metas se implementan creando un MOJO. Este es un archivo de clase anotado con anotaciones de maven-plugin-annotations .

@Mojo(name = "hello")
public final class HelloWorldMojo extends AbstractMojo {

    public void execute() throws MojoExecutionException, MojoFailureException {
         getLog().info("Hello world");
    }
}

Usando la configuración del plugin

Los complementos se pueden configurar anotando los campos con @Parameter . El MOJO luego se inyecta con la configuración.

@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);
    }
}

El parámetro name se puede configurar en el POM:

<plugin>
    <groupId>com.mattunderscore</groupId>
    <artifactId>hello-world-plugin</artifactId>
    <version>1.0-SNAPSHOT</version>
    <configuration>
        <name>Matt</name>
    </configuration>
</plugin>

Si el objetivo de greet se ejecuta como un objetivo independiente, el parámetro de name se puede definir como propiedad en la línea de comando:

mvn <plugin name>:greet -Dname=Geri

Accediendo a la información del proyecto.

El complemento puede, entre otros, acceder a la información sobre el proyecto Maven actual que se está construyendo.

@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());
    }
}

El ejemplo anterior imprimirá en la consola el nombre del proyecto Maven en el que se ejecuta, que se especifica en el elemento <project>/<name> de su POM.

La clase MavenProject utilizada en el complemento requiere una dependencia de maven-core con un alcance de compile (predeterminado) en la POM del complemento:

<dependency>
    <groupId>org.apache.maven</groupId>
    <artifactId>maven-core</artifactId>
    <version>3.3.9</version>
</dependency>

Además, el uso de anotaciones requiere la siguiente dependencia en el POM del complemento:

<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>

Declara una fase por defecto para un gol.

@Mojo(name = "hi", defaultPhase = LifecyclePhase.COMPILE)

Obtener el directorio de compilación como un archivo

@Parameter(defaultValue = "${project.build.directory}")
private File buildDirectory;


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow