| Ce site met a disposition le build journalier de la traduction francaise du Maven: The Definitive Guide Consultez : | ![]() |
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 3.1, « Le Modèle Objet de Projet » pour une analyse du contenu d'un POM.
Le POM se compose de quatre catégories de description et de configuration :
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.
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.
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 5, Profils de Build et
dans la Section A.2, « Détails des settings ».
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.
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 3.1, « Le Super POM ».
Exemple 3.1. Le Super POM
<project>
<modelVersion>4.0.0</modelVersion>
<name>Maven Default Project</name>
<repositories>
<repository>
<id>central</id>
<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>
<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>
<directory>${project.basedir}/target</directory>
<outputDirectory>
${project.build.directory}/classes
</outputDirectory>
<finalName>${project.artifactId}-${project.version}</finalName>
<testOutputDirectory>
${project.build.directory}/test-classes
</testOutputDirectory>
<sourceDirectory>
${project.basedir}/src/main/java
</sourceDirectory>
<scriptSourceDirectory>src/main/scripts</scriptSourceDirectory>
<testSourceDirectory>
${project.basedir}/src/test/java
</testSourceDirectory>
<resources>
<resource>
<directory>${project.basedir}/src/main/resources</directory>
</resource>
</resources>
<testResources>
<testResource>
<directory>${project.basedir}/src/test/resources</directory>
</testResource>
</testResources>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.3</version>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2-beta-2</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.4</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.5</version>
</plugin>
<plugin>
<artifactId>maven-plugin-plugin</artifactId>
<version>2.4.3</version>
</plugin>
<plugin>
<artifactId>maven-rar-plugin</artifactId>
<version>2.2</version>
</plugin>
<plugin>
<artifactId>maven-release-plugin</artifactId>
<version>2.0-beta-8</version>
</plugin>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>2.3</version>
</plugin>
<plugin>
<artifactId>maven-site-plugin</artifactId>
<version>2.0-beta-7</version>
</plugin>
<plugin>
<artifactId>maven-source-plugin</artifactId>
<version>2.0.4</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.4.3</version>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>2.1-alpha-2</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 :
|
Le Super POM par défaut déclare un unique dépôt Maven distant ayant pour ID
|
|
|
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. |
|
|
L'élément |
|
|
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. |