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=helloWorldCet 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 :
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
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:
SNAPSHOT indique enprojet en cours (non livré) et génére des traitements particuliers. <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.
cd hellomvn packagemvn 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].
Le jar contient de la méta information ajoutées par maven:
pom.xml) [2]MANIFEST.MF suivant les conventions de versionnage deJava. Ces informations peuvent éventuellement être utilisées àl'exécution.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
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:
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.