Ce site met a disposition le build journalier de la traduction francaise du Maven: The Definitive Guide
Consultez :
  • Les documents de reference sur le projet original
  • Les sources de la traduction fr sur GitHub
  • maven


    17.3. Descripteur de Plugin

    Un plugin Maven contient une 'carte' qui donne à Maven le chemin des différents Mojos et leur configuration. Ce descripteur de plugin se trouve dans le fichier JAR du plugin, à l'emplacement META-INF/maven/plugin.xml. Quand Maven charge un plugin, il commence par lire ce fichier XML puis instancie et configure les objets du plugin pour en rendre les Mojos disponibles.

    Lorsque vous écrivez des plugins Maven, nous n'avez quasiment jamais besoin de vous soucier du descripteur. Dans le Chapitre 10, Cycle de vie du build, les goals du cycle de vie rattachés au type de packaging maven-plugin montrent que le goal plugin:descriptor est rattaché à la phase generate-resources. Ce goal génère un descripteur de plugin à partir de annotations présentes dans le code source du plugin. Dans la suite du chapitre, nous verrons comment les Mojos sont annotés et comment le contenu de ces annotations se retrouve dans le fichier META-INF/maven/plugin.xml.

    L'Exemple 17.1, « Plugin Descriptor » montre le descripteur du plugin Maven Zip. Comme son nom l'indique, ce plugin permet de construire des archives Zips à partir des résultats du build. Normalement, vous ne devriez jamais à avoir écrire votre propre plugin pour construire des archives avec Maven. Utilisez simplement le plugin Maven Assembly, il est capable de produire des archives dans de multiples formats. Regardez le descripteur de site suivant, cela vous donnera une idée de ce genre de fichier.

    Exemple 17.1. Plugin Descriptor

    <plugin>
      <description></description>
      <groupId>com.training.plugins</groupId>
      <artifactId>maven-zip-plugin</artifactId>
      <version>1-SNAPSHOT</version>
      <goalPrefix>zip</goalPrefix>
      <isolatedRealm>false</isolatedRealm>
      <inheritedByDefault>true</inheritedByDefault>
      <mojos>
        <mojo>
          <goal>zip</goal>
          <description>Zips up the output directory.</description>
          <requiresDirectInvocation>false</requiresDirectInvocation>
          <requiresProject>true</requiresProject>
          <requiresReports>false</requiresReports>
          <aggregator>false</aggregator>
          <requiresOnline>false</requiresOnline>
          <inheritedByDefault>true</inheritedByDefault>
          <phase>package</phase>
          <implementation>com.training.plugins.ZipMojo</implementation>
          <language>java</language>
          <instantiationStrategy>per-lookup</instantiationStrategy>
          <executionStrategy>once-per-session</executionStrategy>
          <parameters>
            <parameter>
              <name>baseDirectory</name>
              <type>java.io.File</type>
              <required>false</required>
              <editable>true</editable>
              <description>Base directory of the project.</description>
            </parameter>
            <parameter>
              <name>buildDirectory</name>
              <type>java.io.File</type>
              <required>false</required>
              <editable>true</editable>
              <description>Directory containing the build files.</description>
            </parameter>
          </parameters>
          <configuration>
            <buildDirectory implementation="java.io.File">
              ${project.build.directory}</buildDirectory>
            <baseDirectory implementation="java.io.File">
              ${basedir}</baseDirectory>
          </configuration>
          <requirements>
            <requirement>
              <role>org.codehaus.plexus.archiver.Archiver</role>
              <role-hint>zip</role-hint>
              <field-name>zipArchiver</field-name>
            </requirement>
          </requirements>
        </mojo>
      </mojos>
      <dependencies>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-io</artifactId>
        <version>1.3.2</version>
      </dependencies>
    </plugin>
    

    Un descripteur de site se compose de trois parties : la configuration haut-niveau qui contient les éléments du type groupId et artifactId, la déclaration des mojos et la déclaration des dépendances. Regardons chacune de ces sections dans le détail.

    17.3.1. Éléments haut-niveau du descripteur de plugin

    Les valeurs de configuration haut-niveau du plugin sont :

    description

    Cet élément contient une courte description du plugin. Dans le plugin Zip, cette description est laissée vide.

    groupId, artifactId, version

    Comme tout artefact Maven, un plugin doit posséder sont triplet de coordonnées unique. Le groupId, l'artifactId et la version sont utilisés pour identifier le plugin dans le dépôt Maven.

    goalPrefix

    Cet élément contrôle le préfixe utilisé pour référencer les différents goals d'un plugin. Si vous regardez le descripteur du plugin Compiler, vous verrez que la valeur du goalPrefix est compiler. De la même manière, si vous regardez le descripteur du plugin Jar, son goalPrefix aura pour valeur jar. Pour votre nouveau plugin il est important de choisir un préfixe qui n'existe pas.

    isolatedRealm (deprecated)

    C'est une propriété legacy qui n'est plus utilisée par Maven. Elle reste présente dans le système pour assurer la compatibilité avec les plugins les plus anciens. Les anciennes versions du Maven utilisaient un mécanisme de chargement des dépendances des plugins dans un ClassLoader isolé. Maven utilise de manière intensive le projet ClassWorlds provenant de la communauté Codehaus pour créer une hiérarchie de ClassLoader qui est modélisée par un objet ClassRealm. N'hésitez pas à ignorer cette propriété et à laisser sa valeur à false.

    inheritedByDefault

    Si cette propriété est à true, il vous est possible de configurer vos mojos dans un projet enfant en reprenant la configuration définie dans son projet parent. Si vous configurez un mojo pour être exécuté durant une phase spécifique dans un projet parent et que cette propriété est à true, l'exécution de celui-ci aura lieu dans le projet fils. À l'inverse, si cette propriété est à false, l'exécution ne tiendra pas compte du projet fils.