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


    9.2. Le POM

    Les projets Maven, les dépendances, les builds, les artefacts : tous sont des objets qu'il va falloir modéliser et décrire. Ces objets sont décrits dans un fichier XML appelé Modèle Objet de Projet. Le POM indique à Maven quel type de projet il va devoir traiter et comment il va devoir s'adapter pour transformer les sources et produire le résultat attendu. Ainsi, comme le fichier web.xml décrit, configure et personnalise une application web Java, c'est la présence d'un fichier pom.xml qui définit un projet Maven. Il s'agit d'une déclaration décrivant un projet Maven; c'est le “plan” abstrait que Maven doit comprendre et suivre pour construire votre projet.

    Vous pouvez aussi voir dans ce fichier pom.xml un équivalent à un fichier Makefile ou à un fichier build.xml pour Ant. Quand vous utilisez GNU make pour construire une application comme par exemple MySQL, vous aurez le plus souvent un fichier Makefile contenant toutes les instructions explicites pour produire un binaire à partir des sources. Quand vous utilisez Apache Ant, vous avez très probablement un fichier build.xml qui contient les instructions explicites pour nettoyer, compiler, packager et déployer une application. make, Ant, et Maven ont en commun le fait qu'il leur faut un fichier avec un nom pré-déterminé, qu'il s'agisse de Makefile, build.xml, ou pom.xml, mais c'est là que les similarités s'arrêtent. Si vous regardez un pom.xml Maven, la plus grande partie du POM se compose de descriptions. Où se trouve le code source ? Où sont les ressources ? Quel est le packaging ? Si vous regardez un fichier build.xml pour Ant, vous verrez quelque chose d'entièrement différent. Vous verrez des instructions explicites pour des tâches comme la compilation de classes Java. Le POM Maven est déclaratif, et même si vous pouvez y inclure des personnalisations procédurales via le plugin Maven Ant, en général vous n'aurez pas besoin de vous plonger dans les délicats détails procéduraux de la construction de votre projet.

    Le POM n'est pas spécifique à la construction de projets Java. Même si la plupart des exemples de ce livre sont des applications Java, il n'y a rien de spécifique à Java dans la définition d'un Modèle Objet de Projet Maven. Si effectivement les plugins par défaut de Maven permettent de construire des artefacts sous forme de JAR à partir d'un ensemble de sources, de tests et de ressources, rien ne vous empêche de définir un POM pour un projet qui contient des sources C# et produit un binaire Microsoft propriétaire avec des outils Microsoft. De même, rien ne vous empêche d'utiliser un POM pour un livre technique. En effet, le source de ce livre et ses exemples sont répartis dans un projet Maven multimodule qui utilise l'un des nombreux plugins Maven pour Docbook afin d'appliquer une feuille XSL Docbook standard à un ensemble de chapitres présents sous la forme de fichiers XML. Certains ont créé des plugins Maven pour transformer du code Adobe Flex en SWCs et SWFs ; d'autres utilisent Maven pour construire des projets écrits en C.

    Nous avons donc établi que le POM décrit et déclare, et qu'il se différencie de Ant ou de Make en ne fournissant pas d'instructions explicites. Nous avons vu que les concepts du POM ne sont pas propres à Java. Regardons tout cela plus en détail au travers de la Figure 9.1, « Le Modèle Objet de Projet » pour une analyse du contenu d'un POM.

    Le Modèle Objet de Projet

    Figure 9.1. Le Modèle Objet de Projet


    Le POM se compose de quatre catégories de description et de configuration :

    Informations générales sur le projet

    Cette catégorie regroupe le nom l'URL et la licence du projet, l'organisation qui produit ce projet, et une liste de développeurs et de contributeurs.

    Configuration du build

    Dans cette section, nous configurons le build Maven en personnalisant le comportement par défaut. Nous pouvons changer l'endroit où se trouvent les sources et les tests, ajouter de nouveaux plugins, lier des goals de plugins au cycle de vie et personnaliser les paramètres de génération du site web.

    Environnement du build

    L'environnement du build consiste en un ensemble de profils qui peuvent être activés pour être utilisés dans différents environnements. Par exemple, au cours du développement vous pouvez vouloir déployer sur un serveur qui sera différent de celui sur lequel vous déploierez en production. L'environnement de build adapte la configuration du build pour un environnement spécifique et il s'accompagne souvent d'un fichier settings.xml personnalisé dans le répertoire ~/.m2. Ce fichier settings.xml est détaillé dans le Chapitre 11, Profils de Build et dans la Section A.2, « Détails des settings ».

    Relations entre POM

    Un projet est rarement isolé. Il dépend souvent d'autres projets, hérite d'une configuration de POM de projets parent, définit ses propres coordonnées, et peut comporter des sous-modules.

    9.2.1. Le Super POM

    Avant de se plonger dans des exemples de POMs, jetons un rapide coup d'œil au Super POM. Tous les POMs de projet Maven étendent le Super POM qui définit un ensemble de valeurs par défaut partagé par tous les projets. Ce Super POM fait partie de l'installation de Maven, et se trouve dans le fichier maven-2.2.1-uber.jar du répertoire ${M2_HOME}/lib. Si vous regardez ce fichier JAR, vous y trouverez un fichier pom-4.0.0.xml dans le package org.apache.maven.project. Le Super POM de Maven est présenté dans l'Exemple 9.1, « Le Super POM ».

    Exemple 9.1. Le Super POM

    <project>
      <modelVersion>4.0.0</modelVersion>
      <name>Maven Default Project</name>
    
      <repositories>
        <repository>
          <id>central</id>  1
          <name>Maven Repository Switchboard</name>
          <layout>default</layout>
          <url>http://repo1.maven.org/maven2</url>
          <snapshots>
            <enabled>false</enabled>
          </snapshots>
        </repository>
      </repositories>
    
      <pluginRepositories>
        <pluginRepository>
          <id>central</id>   2
          <name>Maven Plugin Repository</name>
          <url>http://repo1.maven.org/maven2</url>
          <layout>default</layout>
          <snapshots>
            <enabled>false</enabled>
          </snapshots>
          <releases>
            <updatePolicy>never</updatePolicy>
          </releases>
        </pluginRepository>
      </pluginRepositories>
    
      <build>  3
        <directory>target</directory>
        <outputDirectory>target/classes</outputDirectory>
        <finalName>${pom.artifactId}-${pom.version}</finalName>
        <testOutputDirectory>target/test-classes</testOutputDirectory>
        <sourceDirectory>src/main/java</sourceDirectory>
        <scriptSourceDirectory>src/main/scripts</scriptSourceDirectory>
        <testSourceDirectory>src/test/java</testSourceDirectory>
        <resources>
          <resource>
            <directory>src/main/resources</directory>
          </resource>
        </resources>
        <testResources>
          <testResource>
            <directory>src/test/resources</directory>
          </testResource>
        </testResources>
      </build> 4
      <pluginManagement>
           <plugins>
             <plugin>
               <artifactId>maven-antrun-plugin</artifactId>
               <version>1.1</version>
             </plugin>       
             <plugin>
               <artifactId>maven-assembly-plugin</artifactId>
               <version>2.2-beta-1</version>
             </plugin>
             <plugin>
               <artifactId>maven-clean-plugin</artifactId>
               <version>2.2</version>
             </plugin>
             <plugin>
               <artifactId>maven-compiler-plugin</artifactId>
               <version>2.0.2</version>
             </plugin>
             <plugin>
               <artifactId>maven-dependency-plugin</artifactId>
               <version>2.0</version>
             </plugin>
             <plugin>
               <artifactId>maven-deploy-plugin</artifactId>
               <version>2.3</version>
             </plugin>
             <plugin>
               <artifactId>maven-ear-plugin</artifactId>
               <version>2.3.1</version>
             </plugin>
             <plugin>
               <artifactId>maven-ejb-plugin</artifactId>
               <version>2.1</version>
             </plugin>
             <plugin>
               <artifactId>maven-install-plugin</artifactId>
               <version>2.2</version>
             </plugin>
             <plugin>
               <artifactId>maven-jar-plugin</artifactId>
               <version>2.2</version>
             </plugin>
             <plugin>
               <artifactId>maven-javadoc-plugin</artifactId>
               <version>2.4</version>
             </plugin>
             <plugin>
               <artifactId>maven-plugin-plugin</artifactId>
               <version>2.3</version>
             </plugin>
             <plugin>
               <artifactId>maven-rar-plugin</artifactId>
               <version>2.2</version>
             </plugin>
             <plugin>                
               <artifactId>maven-release-plugin</artifactId>
               <version>2.0-beta-7</version>
             </plugin>
             <plugin>                
               <artifactId>maven-resources-plugin</artifactId>
               <version>2.2</version>
             </plugin>
             <plugin>
               <artifactId>maven-site-plugin</artifactId>
               <version>2.0-beta-6</version>
             </plugin>
             <plugin>
               <artifactId>maven-source-plugin</artifactId>
               <version>2.0.4</version>
             </plugin>         
             <plugin>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.4.2</version>
             </plugin>
             <plugin>
               <artifactId>maven-war-plugin</artifactId>
               <version>2.1-alpha-1</version>
             </plugin>
           </plugins>
         </pluginManagement>
      
      <reporting>
        <outputDirectory>target/site</outputDirectory>
      </reporting>
    </project>

    Le Super POM définit des variables de configuration standards qui seront héritées par tous les projets. Les valeurs de ces variables sont définies dans les sections numérotées :

    1

    Le Super POM par défaut déclare un unique dépôt Maven distant ayant pour ID central. C'est ce dépôt central de Maven qui est configuré par défaut dans toutes les installations de Maven pour être interrogé. Cette configuration peut être surchargée par un fichier settings.xml personnalisé. Attention, le Super POM par défaut a désactivé la récupération des artefacts snapshots depuis le dépôt central de Maven. Si vous avez besoin d'un dépôt snapshot, vous devrez configurer vos dépôts dans votre fichier pom.xml ou votre fichier settings.xml. Le fichier settings.xml et les profils sont traités dans le Chapitre 11, Profils de Build ainsi que dans Section A.2, « Détails des settings ».

    2

    Le dépôt central de Maven contient aussi des plugins Maven. Le dépôt de plugins est par défaut le dépôt central de Maven. La récupération des snapshots est désactivée par défaut et la règle de gestion des mises à jour indique "never", ce qui signifie que Maven ne met jamais automatiquement à jour un plugin si une nouvelle version est publiée.

    3

    L'élément build définit les positions par défaut des répertoires selon la disposition Maven standard des répertoires.

    4

    Depuis la version 2.0.9 de Maven les versions par défaut des plugins du cœur sont définies dans le Super POM. Cela a été mis en place pour apporter une certaine stabilité aux utilisateurs qui ne précisent pas de version dans leurs POMs.

    Le Super POM est toujours le parent de plus haut niveau

    Figure 9.2. Le Super POM est toujours le parent de plus haut niveau