Création d'un projet

La première étape est de créer une structure de projet de toute pièce à partir d'un archétype :

$> mvn archetype:create 
      -DgroupId=fr.norsys 
      -DartifactId=helloWorld
Cet archétype par défaut est une application avec une méthode main() empaquetée sous la forme d'un jar. Cette commande a pour effet de télécharger les plugins et leurs dépendances en fonction des besoins de maven ce qui peut néceessiter un peu de temps la première fois !  

Le résultat en est :

Arborescence des répertoires

L'arborescence créée est la suivante, pour un projet de type jar.  

.
`-- helloWorld
    |-- pom.xml
    `-- src
        |-- main
        |   `-- java
        |       `-- fr
        |           `-- norsys
        |               `-- App.java
        `-- test
            `-- java
                `-- fr
                    `-- norsys
                        `-- AppTest.java

Le POM

POM = Project Object Model. C'est le descripteur de projet principal utilisé par maven. Il centralise l'ensemeble des caractéristiques du projet et la configuration des plugins

<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">

En-tête XML de méta information sur le descripteur: définition du schéma utilisé, instanciation d'un espace de nommage par défaut.

  <modelVersion>4.0.0</modelVersion>

Numéro de version du POM. Maven1 utilise un POM en version 3.

  <groupid>be.peopleware.training.maven</groupid>

Les artefacts sont regroupés par un identifiant de groupe. Par convention, c'est une racine de paquetage Java (un fragment de nomde domaine), sa structure est reproduite dans le référentiel et le plugin archetype l'utilise comme paquetage.

  <artifactId>helloWorld</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>Maven Quick Start Archetype</name>

Caractéristiques de l'artefact  créé par ce projet:

  <url>http://maven.apache.org</url>

L'URL principale du projet.

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

Les dépendances nécessaires au projet. Chaque dépendance indique au moins son identification complète : groupe, artefact et numéro deversion.

Création de l'artefact

  • cd hello
  • mvn package
mvn package
[INFO] Scanning for projects...

Validation du projet  

[INFO] ----------------------------------------------------------------------------
[INFO] Building Maven Quick Start Archetype
[INFO]    task-segment: [package]
[INFO]----------------------------------------------------------------------------

Identification des tâches à réaliser  

[INFO] [resources:resources]
[INFO] Using default encoding to copy filtered resources.

Préparation des ressources de l'artefact (les fichiers non compilés qui seront intégrés dans l'artefact: fichier de propriétés, configurations, images, pages HTML statiques...). Ces ressources sont éventuellement filtrées, c'est à dire qu'elles peuvent contenir des références à des variables ${project.xxx} qui seront résolues lors de la copie (utile pour paramétrer des ressources en fonction de caractéristiques locales).

[INFO] [compiler:compile]
Compiling 1 source file to /home/nono/enseign/maven/hello/target/classes

Compilation du code principal.

[INFO] [resources:testResources]
[INFO] Using default encoding to copy filtered resources.

Préparation des ressources de test. Ces ressources seront disponibles dans le classpath des tests unitaires mais pas dans l'artefact principal.

[INFO] [compiler:testCompile]
Compiling 1 source file to /home/nono/enseign/maven/hello/target/test-classes

Compilation des tests unitaires.

[INFO] [surefire:test]
[INFO] Surefire report directory: /home/nono/enseign/maven/hello/target/surefire-reports


------------------------------------------------------- T E S T S
-------------------------------------------------------Running fr.norsys.AppTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.165 sec


Results :
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0

Exécution des tests unitaires et génération du rapport d'exécution.

[INFO] [jar:jar]
[INFO] Building jar: /home/nono/enseign/maven/hello/target/hello-1.0-SNAPSHOT.jar

Construction de l'archive.

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 7 seconds
[INFO] Finished at: Tue Jun 27 10:23:28 CEST 2006
[INFO] Final Memory: 4M/8M
[INFO] ------------------------------------------------------------

Résultat global. Le construction est réussi si l'objectif final est atteint sans erreur bloquante (eg. si les tests échouent, la construction échoue aussi).  

Un répertoire target est créé dans le répertoire courant du projet. Il contient l'ensemble des entités produites au cours de la construction du projet[1].

Structure du jar produit

Le jar contient de la méta information ajoutées par maven:

nono@osquare:~/enseign/maven/hello$ jar tvf target/hello-1.0-SNAPSHOT.jar
     0 Tue Jun 27 10:23:30 CEST 2006 META-INF/
   213 Tue Jun 27 10:23:28 CEST 2006 META-INF/MANIFEST.MF
     0 Tue Jun 27 10:23:26 CEST 2006 fr/
     0 Tue Jun 27 10:23:26 CEST 2006 fr/norsys/
   533 Tue Jun 27 10:23:26 CEST 2006 fr/norsys/App.class
     0 Tue Jun 27 10:23:30 CEST 2006 META-INF/maven/
     0 Tue Jun 27 10:23:30 CEST 2006 META-INF/maven/fr.norsys/
     0 Tue Jun 27 10:23:30 CEST 2006 META-INF/maven/fr.norsys/hello/
  2529 Tue Jun 27 10:23:28 CEST 2006 META-INF/maven/fr.norsys/hello/pom.xml
   107 Tue Jun 27 10:23:28 CEST 2006 META-INF/maven/fr.norsys/hello/pom.properties

Exemple de fichier MANIFEST.MF

Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven
Built-By: nono
Build-Jdk: 1.5.0_06
Extension-Name: hello
Implementation-Title: hello
Implementation-Version: 1.0-SNAPSHOT

Création du site

Permet de produire automatiquement un site projet:  mvn site. Crée un répertoire target/site contenant un ensemble de pages HTML (rapports) produits par les différents plugins utilisés:

index

Footnotes:  [1]  Bine que cela ne soit pas impossible, il est déconseillé de modifier les fichiers et ressources en dehors de target/ au coursdu processus de construction. Par exemple, il est préférable degénérer des sources dans le répertoire target/generated-srcsplutôt que dans src/

[2]  Il ne s'agit pas d'une simple copie du pom.xml du projet mais d'un descripteur plus complet décrivant l'ensemble des élémentsutilisés par maven. En particulier, la section build qui est leplus souvent implicite (lorsqu'on utilise la structure par défautde projet) est reprise en détail.