Utiliser Maven pour un projet Web

De nos jours, il est encore possible de créer des projets Java sans utiliser d’outils particuliers, mais  les équipes Java sont très rapidement confrontés à des problèmes récurrents et des tâches répétitives :

  • Créer une structure vide pour un nouveau projet
  • Compilation de l’archive finale
  • Lancement de tests Unitaires
  • Déploiement automatique sur différents environnements

Ces questions sont récurrentes pour toute les équipes qui s’intéressent aux problématiques liées aux usines logicielles.

Il est bien sûr encore possible de faire toute ces actions à l’ancienne, mais il existe aujourd’hui un outil qui est devenu une vrai référence dans la communauté Java.

Apache Maven est l’outil open-source qui apporte aux développeurs une gestion et une automatisation des principales tâches nécessaires à la mise en oeuvre et au déploiement d’un projet Java.

L’objectif de cet article n’est pas d’expliquer en détails le fonctionnement de Maven, mais  de donner quelques bases permettant de savoir à quoi peux bien servir Maven, et pourquoi cela peux être intéressant de l’étudier en profondeur pour l’utiliser. Si vous souhaitez en savoir davantage sur Maven, vous pouvez consulter cet article sur les livres indispensables pour comprendre l’outil Apache Maven.

Je prépare actuellement un autre article sur la réalisation pas à pas d’un projet Web utilisant Spring et Maven qui sera bientôt disponible

Maven : les bases

Convention

Plutôt d’avoir des projets avec des architectures et arborescence exotiques, Maven repose sur un certain nombre de conventions à respecter et une arborescence de fichiers pré-définie. Cette solution facilite grandement la configuration d’un projet Maven dit « standard » dans le sens où votre projet d’application Web ne doit pas être si différent des centaines de milliers de projet d’application Web développés avant vous. Le standard Maven permet d’utiliser une configuration et une arborescence qui a fait ses preuves évitant de reproduire sans cesse les mêmes erreurs.

Ces conventions font la force de Maven, et permet également à n’importe quel développeur Java de passer d’un projet Maven à l’autre et de retrouver très vite ces marques, car l’arborescence et la manière de faire sera identique.

Seul quelques cas très spécifiques à vos applications nécessiteront une configuration avancée et technique de Maven.

Configuration

Malgré tout, un minimum de configuration est nécessaire pour créer un projet qui fonctionne. Cette configuration permet avant tout de :

  • gérer les paramètres de l’application :
    • On veut générer une archive jar ou une webapp war?
    • On veut compiler dans quel version de Java?
    • Dans quel langage, car Maven peux être utilisé pour d’autres langages
  • gérer les dépendances et librairies de votre projet.
    • De quelles librairies mon application a besoin, et de quoi ces librairies ont elles-même besoins pour fonctionner?
    • Quel est la version de tel librairie que j’utilise
  • gérer des plugins pour faire toujours plus:
    • Déploiement automatique de l’application
    • Gestion des différents environnements (Dev, Recette, Qualité, Production)
    • Interagir des outils mis en place pour gérer votre usine logiciel 

La configuration d’un projet Maven se fait à l’aide d’un fichier pom.xml situé à la racine du projet.

L’un des principaux points fort de Maven est son utilisation en ligne de commande. Il n’est pas rare de continuer à utiliser la ligne de commande conjointement à un IDE moderne.

Ne soyez pas étonné si les articles sur Maven font le plus souvent référence à des actions en ligne de commande au lieu d’indiquer l’emplacement de l’option dans un menu quelconque d’un l’IDE spécifique.

Installer Maven

Il faut télécharger et décompresser l’archive de la version 3 depuis le site http://maven.apache.org/

Une fois décompressé dans un répertoire, il faut ajouter le répertoire bin de maven à votre PATH pour pouvoir exécuter la commande mvn de Maven depuis n’importe quel répertoire. Habitué à Java, vous avez probablement déjà effectué cette opération.

L’installation est terminé à partir du moment ou vous pouvez executer ceci:

 mvn -version 

Maven et les Environnement de Développement (IDE)

Globalement,Maven est plutôt bien intégré à la plupart des dernières versions des IDE les plus connues:

  • Les projets Netbeans sont nativement des projet Maven
  • IntelliJ et Eclipse avec un plugin à installer

Le chapitre ci-dessous présente la configuration de Maven avec Eclipse. Nous supposons donc que vous avez déjà installer Java et Eclipse sur votre poste.

Configurer Eclipse pour Maven et les projets web

Attention sur la notion de « plugin », Maven et Eclipse ont tous les 2 un système d’extension et d’installation de plugin. Dans l’explication ci-dessous, notez bien la précision en gras pour préciser si il s’agit d’un plugin Eclipse, ou d’un plugin Maven.

Pendant longtemps, Eclipse n’a pas été l’ami de Maven, et il fallait passer par un plugin dans Maven qui se chargeait d’adapter le fichier .project utilisé par Eclipse. Cette cohabitation ne se passait pas toujours bien, et pouvait rendre le démarrage de votre application web impossible dans Eclipse. Une autre solution était de choisir entre 2 plugins Maven à installer dans Eclipse, mais ces plugins était buggés et ne permettait pas de gérer toute les fonctionnalités de Maven.

Depuis, la communauté Eclipse a fait de très nombreux efforts pour s’adapter au standard Maven et un plugin a finit par se démarquer, l’intégration est désormais facilité. Le plugin fera le lien permanent entre la configuration Maven du projet et la configuration Eclipse du projet. Toute modification du fichier de configuration de maven sera automatiquement répercuté sur le projet Eclipse, et vice-versa.

Pour installer le plugin, il faut se rendre Help > Eclipse Marketplace et rechercher les plugins « Maven ».

Le plugin est décomposé en 2 parties, attention à bien choisir le bon plugin:

  • Maven Integration for Eclipse(m2e)  pour les projets Java NON WEB
  • Maven Integration for Eclipse WTP (m2e-wtp) est recommandé pour les projets Web

Eclipse Web Tools Platform(WTP) est un composant d’Eclipse inclus dans la version d’Eclipse for Java EE et permet de gérer tous les projets Web, ainsi que la gestion des serveurs dans Eclipse.

Le choix du mauvais plugin peux être désastreux,et vous donner une opinion très négative  de Maven sur un premier projet.

Si vous installer le premier plugin pour un projet web, la cohésion de la configuration Maven avec celle du projet Web dans Eclipse ne se fera pas correctement : chaque compilation de Maven en ligne de commande aura pour conséquence d’écraser la configuration du projet Eclipse pour l’adapter à un projet Java non Web, ce qui empêchera le déploiement de votre projet sur un serveur depuis Eclipse.

Pensez donc à choisir le deuxième plugin pour développer vos projets Web.

Créer une structure de projet Web vide

Maven permet de créer un projet en se basant sur un archétype. Un archetype peux être vu comme un template de projet. Il en existe certains proposé pas Maven, mais n’importe qui peux créer son propre archétype, et le rendre public. Une équipe java pourrait se créer son propre template pour tours avoir une connexion LDAP de pré configuré dans tous ses projets par exemple.

GroupId/ArtifactId

Le groupId est l’identification de votre organisation, ou site internet, à l’origine du projet. GroupId suit les mêmes règles de nommage que les packages Java. L’artifactId est l’identifiant du projet au sein de ce groupe.

Un projet Maven développer par w3blog serait nommé ainsi fr.w3blog/mon-projet-maven

<groupId>fr.w3blog</groupId>
 <artifactId>mon-projet-maven</artifactId>

Pour créer un projet web en ligne de commande , on va donc utiliser l’archetype maven-archetype-webapp qui initialise un projet web par défaut

mvn archetype:generate -DarchetypeGroupId=maven-archetype-webapp -DgroupId=fr.w3blog -DartifactId=mon-projet-maven

Si vous êtes connecté derrière un proxy, penser à configurer Maven pour l’utiliser car Maven nécessite internet pour télécharger les dépendances.

Ou, sinon dans Eclipse, New Project > Maven Project . Cliquer sur Next dans le premier écran. et recherche l’archétype dans le second écran.

eclipse-maven-archetype

eclipse-maven-groupidartefact

Voila à quoi va ressembler votre arborescence initiale.

arborescence-maven

Arborescence Maven webapp

Un répertoire contenant les sources de votre projet divisé en 2 parties:

  • main, contenant toutes les ressources, sources java nécessaire à l’execution du projet
  • test, contenant  les ressources et les classes nécessaire aux tests unitaire de d’intégration de votre projet.

Dans le répertoire main, on retrouve :

  • ressources, contenant tous les fichiers de configuration, traduction, context, etc.
  • webapp, contenant tous les fichiers livrés dans le war final

Il vous faudra ensuite créer un répertoire java dans le répertoire main, contenant vos packages et vos sources java.

Si vous développer dans un autre langage, la convention veut que vous crééer un répertoire différent pour chaque langage.

Voila, à quoi peux ressembler un fichier de configuration Maven pom.xml

<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">
  <modelVersion>4.0.0</modelVersion>
  <groupId>fr.w3blog</groupId>
  <artifactId>mon-projet-maven</artifactId>
  <packaging>war</packaging>
  <version>0.0.1-SNAPSHOT</version>
  <name>mon-projet-maven Maven Webapp</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
  <build>
    <finalName>mon-projet-maven</finalName>
  </build>
</project>

La structure de votre projet est maintenant créée, il ne vous reste plus qu’à la développer selon l’architecture/framework choisit:

  • Servlet Classique
  • Spring
  • EJB

A noter qu’il est très probablement possible qu’il existe des archetypes maven plus sophistiqués qui vous permettrons d’initialiser votre projet directement avec une configuration Spring ou EJB pré-établit, et ainsi vous faire gagner quelques étapes dans la création d’un projet.