Qu'est-ce que Maven et pourquoi faut-il l'utiliser ?
Maven permet de faciliter et d'automatiser certaines tâches de la gestion d'un projet Java. Il permet notamment :
Pour gérer les dépendances du projet vis à vis de bibliothèques, Maven utilise un ou plusieurs dépôts (appelés "") qui peuvent être locaux (.maven/repository) ou distants (http://www.ibiblio.org/maven par défaut)
Maven est extensible grâce à un mécanisme d'extension qui permet d'ajouter des fonctionnalités.
Maven comparé à Ant.
Au premier abord, il est facile de croire que Maven fait double emploi avec Ant. Ant et Maven sont tous les deux développés par le groupe Jakarta, ce qui prouve bien que leur utilité n'est pas aussi identique.
Ant dont le but est d'automatiser certaines tâches répétitives est plus ancien que Maven. Maven propose non seulement ces fonctionnalités mais en propose de nombreuses autres.
Mettre en place Maven.
Installez Maven sur votre machine.
Ici, la procédure diffère selon le système d'exploitation que vous utilisez. L'installation sous Linux est extrêmement simple, l'installation sous Windows l'est moins.
Installation sous Windows.
Il faut télécharger la version la plus récente de Maven sur le site officiel et la dézipper.
Avec assistant.
Un assistant permet de fournir les informations concernant l'installation :
 C:\Program Files\Apache Software Foundation\maven-2.0.3
Un élément de menu nommé « Apache Software Foundation / Maven --version » est ajouté dans le menu « Démarrer / Programmes ».
Pour utiliser Maven, la variable d'environnement système nommée MAVEN_HOME doit être définie avec comme valeur le chemin absolu du répertoire dans lequel Maven est installé. Par défaut, cette variable est configurée automatiquement lors de l'installation sous Windows.
 C:\Program Files\Apache Software Foundation\maven-2.0.3\bin";%PATH%
Il est aussi particulièrement pratique d'ajouter le répertoire %MAVEN_HOME%/bin à la variable d'environnement PATH. Maven étant un outil en ligne de commande, cela évite d'avoir à saisir son chemin complet lors de son exécution.
Il faut s'assurer également que le JDK est installé. Le répertoire par défaut sous Windows est codice_1 (Exemple: codice_2).
Enfin, il faut créer un repository local en utilisant la commande ci dessous dans une boîte de commandes DOS :
 C:\>install_repo.bat %HOMEDRIVE%%HOMEPATH%
Sans assistant.
Il suffit de placer les fichiers dans un répertoire qui sera spécifié dans la variable d'environnement M2_HOME.
Ensuite, définir les variables d'environnement correspondantes, par exemple :
Installation sous GNU/Linux.
Rien n'est plus simple : utilisez votre gestionnaire de paquets.
Installation sous Mac OS X.
avec le gestionnaire de paquets Homebrew
$ brew install maven
ou macPorts
$ sudo port install maven3
Testez votre installation.
$ mvn --version
Configurez Maven.
Dans votre répertoire personnel, vous trouverez un dossier « .m2 » contenant un fichier « settings.xml » qui va vous permettre de configurer Maven.
Si vous êtes derrière un proxy réseau.
Maven utilise abondamment HTTP.
Créez un premier projet.
Maven se base sur les conventions pour trouver tous les composants de vos projets, suivez-les et Maven se débrouillera sans aucune configuration.
Arborescence d'un projet Maven.
Voici l'arborescence minimum d'un projet Maven.
Le « Project Object Model » : fichier pom.xml.
Tous les projets Maven sont identifiés de façon unique. Pour cela, un projet est identifié par 3 valeurs :
Commençons par un pom minimal :
<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/maven-v4_0_0.xsd">
 <!-- Toujours utiliser 4.0.0 pour maven 2.x -->
 <modelVersion>4.0.0</modelVersion>
 <!-- groupId, artifactId et version actuelle -->
 <groupId>org.wikibooks.fr</groupId>
 <artifactId>projet-minimal</artifactId>
 <version>1.0</version>
 <!-- la façon dont sera packagée l'application -->
 <packaging>jar</packaging>
 <!-- un nom pour le projet -->
 <name>Un projet d'exemple pour le livre Développer en Java de Wikibooks</name>
 <!-- l'adresse du site qui présente cette application -->
 <url>http://fr.wikibooks.org/wiki/Développer_en_Java/Introduction_à_Apache_Maven</url>
</project>
Gérez les dépendances de votre projet.
Maven gère toutes les dépendances de vos projets. Pour cela, il stocke toutes les bibliothèques de vos projets dans un dépôt local situé "~/.m2/repository". À chaque fois que vous demanderez à Maven de construire le projet, Maven ira chercher toutes les dépendances dans votre dépôt local. Si Maven ne trouve pas la dépendance dans votre dépôt local, il ira automatiquement la télécharger depuis un dépôt sur Internet et l'ajoutera à votre dépôt local. Au début, votre dépôt est vide, donc Maven téléchargera beaucoup de choses lors des premières utilisations.
Votre dépôt local est bien rangé, Maven organise tout et range toutes les bibliothèques selon le groupId, l'artifactId et les versions. À tout moment, vous pouvez supprimer l'intégralité de votre dépôt local pour faire le ménage. Maven ne re-téléchargera que le nécessaire.
Comment trouver des bibliothèques ?
Lorsque Maven cherche une dépendance sur Internet, il s'oriente vers un dépôt principal où se trouvent l'essentiel des bibliothèques Java disponibles et qui s'appelle « central ». Et l'application en ligne Nexus permet de parcourir son contenu et de faire des recherches par groupId, artifactId et version. Une fois que vous avez trouvé la bibliothèque qui remplit vos besoin, l'application peut vous donner le petit code XML à ajouter au POM du projet.
Déclarer une dépendance.
Si votre application a besoin d'une dépendance, c'est simple, il suffit d'ajouter au POM la dépendance : son groupId, artifactId et version. Par exemple, pour que les développeurs bénéficient de l'API commons lang, il suffit d'ajouter dans le POM :
 <dependencies>
 <dependency>
 <groupId>commons-lang</groupId>
 <artifactId>commons-lang</artifactId>
 <version>2.5</version>
 </dependency>
 </dependencies>
Pour compiler ou lancer le projet, Maven ira chercher la dépendance dans le dépôt local, ou sur Internet si besoin.
Les différents « scope ».
Une dépendance a une portée ("scope"), c'est à dire qu'elle est utilisée pour certaines tâches.
Il existe les portées ("scopes") suivantes :
Par la suite, nous aurons l'usage des ces différents "scopes".
Un POM d'exemple complet.
<?xml version="1.0" encoding="UTF-8"?>
<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, artifactId et version actuelle -->
 <groupId>org.wikibooks.fr</groupId>
 <artifactId>projet-minimal</artifactId>
 <version>1.0</version>
 <!-- la façon dont sera packagée l'application -->
 <packaging>jar</packaging>
 <!-- un nom pour le projet -->
 <name>Un projet d'exemple pour le livre Développer en Java de Wikibooks</name>
 <!-- l'adresse du site qui présente cette application -->
 <url>http://fr.wikibooks.org/wiki/Développer_en_Java/Introduction_à_Apache_Maven</url>
 <dependencies>
 <dependency>
 <groupId>commons-logging</groupId>
 <artifactId>commons-logging</artifactId>
 <version>1.1.1</version>
 <scope>compile</scope>
 </dependency>
 <dependency>
 <groupId>log4j</groupId>
 <artifactId>log4j</artifactId>
 <version>1.2.16</version>
 <scope>runtime</scope>
 </dependency>
 <dependency>
 <groupId>commons-io</groupId>
 <artifactId>commons-io</artifactId>
 <version>1.4</version>
 </dependency>
 <!-- test -->
 <dependency>
 <groupId>junit</groupId>
 <artifactId>junit</artifactId>
 <version>4.8.1</version>
 <scope>test</scope>
 </dependency>
 </dependencies>
 <properties>
 </properties>
 <build>
 </build>
</project>
Profitez des fonctionnalités de Maven.
Tout est en place, le projet est prêt. On peut maintenant passer à l'action et profiter des nombreuses possibilités offertes par Maven.
Construire le projet.
La construction d'un projet se passe en différentes phases successives qui décrivent le cycle de vie ("Build Lifecycle") :
Une autre phase est :
Voici quelques exemples d'utilisation :
mvn compile # exécute la phase validate puis la phase compile
mvn package # fait appel à toutes les phases précédentes
mvn clean test # exécute la phase clean puis la phase test
mvn install -Dmaven.test.skip # saute la compilation et l'exécution des tests
mvn install -DskipTests # compile les tests mais saute l'exécution
Il y a d'autres phases intermédiaires mais nous avons choisi de ne vous présenter que celles qui sont utilisées 80% du temps.
Exploiter les nombreuses possibilités offertes par les extensions Maven.
L'outil codice_31 peut faire appel à des extensions. Chaque extension est proposée avec un ensemble d'actions possibles appelées codice_32. On utilise alors codice_33.
Pour la plupart des extensions, il existe un goal codice_34. Par exemple, codice_35 devrait donner l'aide pour l'extension javadoc et tous les goals que propose cette extension.
Générer un site internet pour le projet.
mvn site:site
Générer la javadoc.
La documentation sera générée dans "target/site/apidocs".
mvn javadoc:javadoc
Packager l'application.
Générer un jar avec toutes les dépendances incluses. Utile pour proposer une version complète "stand-alone" de l'application.
mvn assembly:assembly -DdescriptorId=jar-with-dependencies
Générer un jar avec seulement les sources, idéal pour distribuer le code à des développeurs pour qu'ils l'intègrent à leur IDE.
mvn assembly:assembly -DdescriptorId=src
Exécuter une classe java.
Si vous voulez exécutez le programme, vous pouvez faire
mvn package
cd target
java -jar mon-artifact.jar
Cela ne fonctionnera pas étant donné qu'il faut ajouter au CLASSPATH tout un tas de fichier jar qui se trouvent dans votre dépôt local. La plug-in "exec" vous permet d'exécuter un programme principal.
mvn exec:java -Dexec.mainClass=org.wikibooks.fr.ClassePrincipale -Dexec.args="argument1 argument2"
On peut aussi ajouter les informations sur le nom de la classe principale, les arguments et les réglages systèmes dans le POM.
Surveiller les mises à jours des dépendances.
À tout moment, vous pouvez vérifier la disponibilité de nouvelles versions de vos dépendances avec 
mvn versions:display-dependency-updates
Ce plug-in versions permet également de mettre à jour automatiquement les numéros de versions dans un projet.