wiki:Maven

Gestion de projets Java avec Maven

TOC?

Introduction

Maven est un outil de gestion de projets, qui s'occupe du cycle de vie complet d'une application Java. Son utilisation accélère la création d'un projet, grâce à la gestion et le téléchargement automatique des dépendances de l'application depuis Internet, mais également grâce à un certain nombre de modèles de projets.

Le descripteur de projet

Le descripteur de projet Maven est un fichier XML nommé pom.xml, placé à la racine du projet. L'exemple ci-dessous montre un descripteur de projet pour une application Web nommée Test Servlet.

<?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/maven-v4_0_0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <groupId>fr.enib</groupId>
    <artifactId>test-servlet</artifactId>
    <packaging>war</packaging>
    <name>Test Servlet</name>
    <version>1.0-SNAPSHOT</version>

    <dependencies>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>taglibs</groupId>
            <artifactId>standard</artifactId>
            <version>1.1.2</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.3.1</version>
        </dependency>

    </dependencies>

</project>

Description du projet

  • groupId : organisation responsable du projet, Pour l'ENIB, la valeur la plus adaptée serait fr.enib.
  • artifactId : nom informatisé du projet.
  • packaging: format de l'archive du projet. La valeur est jar pour une archive classique, war pour une archive de projet web, ear pour une application d'entreprise.
  • name : nom du projet, destiné à un utilisateur humain.
  • version : numéro de version du projet.

Les dépendances

  • Les dépendances du projets sont définies à l'intérieur de l'élément dependencies. Chaque sous-élément dependency crée une dépendance vers un autre projet Maven. Ce sous-élément possède un certain nombre d'éléments, vus dans la section précédente, mais aussi une balise scope, qui définit comment la dépendance sera incluse au projet. Le scope peut prendre pour valeur provided, qui indique que la librairie sera fournit par le conteneur de l'application (ex : l'API des servlets), ou encore test, qui indique que la dépendance n'est utilisée que dans le cadre des tests unitaires.

Structure d'un projet

Par défaut, les projets Maven suivent une arborescence de dossiers et fichiers très précise. Le respect de la structure classique des dossiers permettent à un développeur habitué à Maven de prendre ses marques très rapidement.

L'arbre suivante présente cette structure par défaut pour une application web.

  • src : sources du projet
    • main : sources du projet, qui seront distribuables
      • java : fichiers sources Java
      • resources : ressources associées au classes Java
      • webapp : fichiers de l'application web
        • WEB-INF
    • tests : tests unitaires
      • java : fichiers sources Java des tests unitaires
      • resources : ressources utiles aux tests unitaires
  • target : dossier de compilation (on y retrouve également le projet packagé sous forme distribuable)
    • classes : classes Java compilés
    • test-classes : classes Java de tests unitaires

Les buts principaux

Maven propose un certain nombre de buts (goals) ayant trait à la vie du projet. Voici une liste des buts les plus utiles.

But Description
compile Compiler les sources du projet
test Lancer les tests unitaires du projet
package Création d'une archive distribuable du projet (jar, war, etc)
install Installer le projet dans le dépôt Maven local
clean Supprimer les fichiers compilés
javadoc:javadoc Générer la documentation de l'API Java
source:jar Générer une archive contenant les sources du projet
eclipse:eclipse Générer un projet Eclipse

L'exécution d'un but se fait grâce à la commande suivante : mvn nom_du_but.

Un nombre important de  plugins est disponible sur le site de Maven, ce qui ouvre encore plus de perspectives pour gérer votre projet.

Quelques astuces

Intégration avec Eclipse

Un plugin est proposé pour  Eclipse à l'adresse suivante :  http://m2eclipse.codehaus.org/. Il ajoute les fonctionnalités suivante à l'éditeur :

  • La création de projets Maven ;
  • La recherche de dépendances dans le dépôt distant ;
  • L'exécution de commandes Maven.

Exécution d'un projet web sur Tomcat

Un plugin Maven autorise l'exécution d'un projet web dans le conteneur de servlets Tomcat. Il est disponible à l'adresse suivante :  http://mojo.codehaus.org/tomcat-maven-plugin/. Ceci évite la configuration manuelle d'un serveur et accélère les procédures de tests d'un projet indépendant.

Il faut tout d'abord indiquer dans le descripteur du projet qu'on souhaite utiliser le plugin Tomcat :

<project>
    ...
        <build>
            ...

                <plugins>

                    ...

                    <!-- Ce plugin rend disponible les goals de Tomcat -->
                    <plugin>
                        <groupId>org.codehaus.mojo</groupId>
                        <artifactId>tomcat-maven-plugin</artifactId>
                    </plugin>

                    ...

                </plugins>

            ...
        </build>
    ...
</project>

Nous pouvons ensuite exécuter le projet grâce à la commande mvn tomcat:run.

Attention : si vous souhaitez ne pas configurer le serveur Tomcat, vérifiez qu'aucun serveur actif n'occupe le port 8080.

Créer une portlet pour Pluto

 Pluto est l'implémentation de référence de la spécification JSR-168. Mais l'exécution d'une portlet sur ce portail nécessite la création d'un fichier web.xml spécial.

<project>
    ...
    <build>
        ...
        <plugins>

            ...

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <configuration>
                    <webXml>
                        ${project.build.directory}/pluto-resources/web.xml
                    </webXml>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.pluto</groupId>
                <artifactId>maven-pluto-plugin</artifactId>
                <version>1.1.2</version>
                <executions>
                    <execution>
                        <phase>generate-resources</phase>
                        <goals>
                            <goal>assemble</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

            ...

        </plugins>
        ...
    </build>
    ...
</project>