Apache Maven
Crear un complemento de Maven
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;