lundi 7 janvier 2013

Création de plugin maven [1/2]

Maven permet de facilement (une fois son fonctionnement compris) de construire, livrer, installer un projet.

Maven fonctionne sur la base de plugin. Toutefois, il n'est pas rare qu'un besoin particulier s'exprime et qu'aucun plugin n'y réponde.
Il faudra alors écrire soit même un plugin.

L'écriture de plugin est relativement aisée. C'est plutôt ce que doit faire le plugin qui n'est pas trivial.

Il existe deux types de plugin. Celui qui nécessite un projet pour s'exécuter (donc un pom.xml), comme par exemple maven-compiler-plugin.
Et celui qu'il est possible de lancer sans projet.

Premier plugin maven

Pouc commencer, un plugin sans projet pas être créé. Il affichera un message dans les logs. Ce message sera paramètrable (donc facultatif).

Voici la classe du plugin :
package org.test.maven.plugin;

import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;

/**
 * 
 * @author Emeric MARTINEAU
 * @goal hello
 * @requiresProject false
 */
public class HelloWorld extends AbstractMojo {

 /**
  * @parameter expression="${hello.str}" default-value="Hello World!"
  */
 private String helloStr;  
  
 @Override
 public void execute() throws MojoExecutionException, MojoFailureException {
  getLog().info(helloStr) ;
 }

}
Elle hérite nécessairement de la classe org.apache.maven.plugin.AbstractMojo.
Sera implémenté la méthode execute().

La configuration du plugin se fait via la JavaDoc et certaines balises @.
Ici pour la classe il y a le goal définit par @goal hello et si un projet est requis @requiresProject false.
Il est possible d'indiquer la phase avec @phase.

La classe accèpte un paramètre hello.str configuré avec @parameter expression="${hello.str}" default-value="Hello World!".
Il peut être valoriser en ligne de commande via -Dhello.str=xxxx ou dans un pom avec :
<configuration>
 <hello.str>Bonjour le monde !</hello.str>
</configuration>
Si aucun paramètre n'est communiqué, le paramètre prendra la valeur Hello World!.

Et son pom associé :
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.test.maven.plugin</groupId>
    <artifactId>test-plugin-maven</artifactId>
    <packaging>maven-plugin</packaging>
    <version>1.0.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>org.apache.maven</groupId>
            <artifactId>maven-plugin-api</artifactId>
            <version>3.0.4</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugin</groupId>
                <artifactId>maven-plugin-plugin</artifactId>
                <version>3.2</version>
                <configuration>
                    <goalPrefix>testPluginMaven</goalPrefix>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

Exemple d'exécution sans paramètre :
mvn org.test.maven.plugin:test-plugin-maven:hello

[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- test-plugin-maven:1.0.0-SNAPSHOT:hello (default-cli) @ standalone-pom ---
[INFO] Hello World!
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 5.297s
[INFO] Finished at: Thu Dec 13 11:01:56 CET 2012
[INFO] Final Memory: 4M/245M
[INFO] ------------------------------------------------------------------------
Exemple d'exécution avec paramètre :
mvn org.test.maven.plugin:test-plugin-maven:hello -Dhello.str="bonjour ca va ?"

[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- test-plugin-maven:1.0.0-SNAPSHOT:hello (default-cli) @ standalone-pom ---
[INFO] bonjour ca va ?
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.234s
[INFO] Finished at: Thu Dec 13 11:55:40 CET 2012
[INFO] Final Memory: 6M/309M
[INFO] ------------------------------------------------------------------------
Le fait que le plugin est exécuté sans pom se remarque à standalone-pom juste au dessus du texte affiché par le plugin.

Aucun commentaire:

Enregistrer un commentaire