Beruflich Dokumente
Kultur Dokumente
Maven
1 Installation
Maven, comme Tomcat et ANT, sinstalle simplement en dzippant une archive rcupre sur le site
principal : http://maven.apache.org
Nous travaillerons au cours de cette sance avec une version 2.2.1, il sera spcifiquement fait
mention si certaines fonctionnalits abordes sont diffrentes avec Maven 3.
Commencez par ouvrir une console (root) puis excutez les instructions suivantes :
cd /usr/local
tar zxvf ~esup/Bureau/apache-maven-2.2.1-bin.tar.gz
ln -s apache-maven-2.2.1 maven
update-alternatives --install /usr/bin/mvn mvn /usr/local/maven/bin/mvn 0
mvn --version
Warning: JAVA_HOME environment variable is not set.
Apache Maven 2.2.1 (r801777; 2009-08-06 21:16:01+0200)
Java version: 1.6.0_24
Java home: /usr/lib/jvm/java-6-sun-1.6.0.24/jre
Default locale: fr_FR, platform encoding: UTF-8
OS name: "linux" version: "2.6.35-25-generic" arch: "i386" Family: "unix"
Soit dans lenvironnement utilisateur (dans le fichier .bashrc, faire pour tous les
utilisateurs utilisant Maven)
Soit directement dans le fichier /usr/local/maven/bin/mvn, il faudra veiller
reporter cette modification en cas de mise jour de Maven
2 Mon premier projet
Nous allons dans un premier temps crer une arborescence pour notre projet, nous verrons par la
suite en dtail sa structure. Voici les commandes excuter dans un terminal (non root) :
mkdir -p esup-hello/src/main/java
gedit esup-hello/src/main/java/Main.java
Dans le fichier Main.java, nous allons crire un code minimal et bien connu :
gedit esup-hello/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>org.esupportail</groupId>
<artifactId>esup-hello</artifactId>
<version>1.0.0-SNAPSHOT</version>
<name>esup-hello</name>
</project>
Le projet est termin, il ne reste plus qu lancer la commande Maven permettant sa construction. La
premire excution peut tre relativement longue puisque Maven va tlcharger tous les modules
dont il a besoin pour raliser la construction du projet :
cd esup-hello
mvn install
Si tout sest correctement pass vous devriez reprer les lments suivants :
Travailler en ligne de commande peut vite savrer fastidieux, dautant que la plupart des
dveloppeurs utilisent dj un environnement de dveloppement intgr. Nous allons donc regarder
comment configurer et utiliser le plugin m2eclipse dans Eclipse.
3.1 Configuration
Sur le bureau se trouve un raccourci vers une installation dEclipse o le plugin est dj install mais
nest pas encore configur.
Une fois Eclipse dmarr, fermez la page Welcome pour accder au plan de travail, puis choisissez
dans le menu Window loption Preferences.
General > Workspace : vrifiez que lencodage est bien forc en UTF-8 pour tous les
contenus (important sous Windows)
Java > Compiler : vrifiez quEclipse applique par dfaut une vrification du code Java
relative la version 1.6 du JDK.
Java > Installed JREs > Execution Environnments : pour les environnements J2SE-1.2, 1.3,
1.4, 1.5 et JavaSE-1.6 cochez linstallation courante du JDK (le JDK 1.6 est compatible avec
toutes les versions prcdentes)
Maven > Installations : configurez une nouvelle installation pointant vers le dossier
/usr/local/maven et activez la. Pour information, Eclipse embarque une version 3.x
Snapshot de Maven.
Maven > POM Editor : cochez loption Open XML page in the POM editor by default
Nous allons maintenant importer notre premier projet dans Eclipse. La suite de ces travaux pratiques
prsuppose une certaine habitude lutilisation dEclipse.
Crez un nouveau projet de type Java, faites le pointer vers notre dossier esup-hello puis dans la
configuration du projet (avant de finaliser sa cration), ralisez les oprations suivantes :
Une fois cette option active, Maven va automatiquement excuter les oprations suivantes :
Toutes ces oprations sont lies lhritage des proprits du super pom Maven . Malheureusement
dans notre cas, certaines de ces prsomptions (en particulier la version de Java utiliser) sont
errones. Nous allons modifier ce comportement par dfaut en surchargeant la configuration Maven
dans notre fichier 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>org.esupportail</groupId>
<artifactId>esup-hello</artifactId>
<version>1.0.0</version>
<name>esup-hello</name>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
Il reste actualiser le projet pour reflter ces changements en faisant un clic droit sur le projet et en
choisissant Maven > Update project configuration.
Vous pouvez valider la construction du projet en excutant les tches clean et install :
On remarquera que la structure de rpertoire cre est plus fournie que celle du tout premier projet
avec l'apparition de dossiers main/resources, test/java et test/resources.
4 Dpendances
Nous allons reprendre le projet esup-hello et lui ajouter des fonctionnalits de logging l'aide de la
librairie log4j. Pour cela, nous allons commencer par diter le fichier pom.xml et lui ajouter la
section dependencies suivante (aprs la section build) :
<dependencies>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.16</version>
</dependency>
</dependencies>
Si tout s'est bien pass, l'enregistrement du fichier pom.xml a dclench le rapatriement des
librairies commons-logging et log4j vers le cache local et leur ajout au classpath du projet. Nous
pouvons alors modifier notre fichier Main.java pour le faire ressembler ceci :
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class Main {
La dernire tape consiste en la cration d'un fichier log4j.xml, celui-ci devant se trouver dans le
classpath du projet, nous le crerons dans le dossier src/main/resources :
<root>
<level value="info" />
<appender-ref ref="console-appender" />
</root>
</log4j:configuration>
L'excution du projet (clic droit sur le fichier Main.java > Run as > Java Application) donne
dsormais un rsultat diffrent avec une ligne supplmentaire dans la console.
5 Miroir, dploiement
Dans cette partie, nous allons examiner deux aspects fondamentaux de Maven :
Nous utiliserons pour cela le repository Nexus de Sonatype, prinstall sur la machine virtuelle.
Nexus gre les deux cas d'utilisation (miroir, dploiement) mais il est trs important de distinguer ces
deux fonctions pour des raisons que nous expliquerons plus loin.
5.1 Miroir
L'utilisation d'un miroir permet principalement deux choses :
Travailler depuis un poste qui se trouverait sur un rseau priv et n'ayant pas d'accs direct
l'Internet
Dans une entreprise limite en dbit vers l'Internet, le miroir permet d'viter le
tlchargement rptitif des mmes modules par plusieurs dveloppeurs, et d'acclrer les
transferts
La configuration d'un miroir est propre au poste sur lequel le dveloppeur travaille, il est donc
logique de ne pas la trouver dans le fichier pom.xml d'un projet. Elle peut tre ralise deux
endroits distincts :
Nous allons crer et modifier le fichier ~/.m2/settings.xml (depuis une console avec gedit) :
<mirrors>
<mirror>
<id>local</id>
<mirrorOf>central</mirrorOf>
<name>Nexus</name>
<url>http://localhost:9080/content/groups/public</url>
</mirror>
</mirrors>
</settings>
Une fois le fichier enregistr, il est ncessaire d'indiquer Eclipse que la configuration utilisateur
locale a chang :
Window > Preferences > Maven > User Settings > Update Settings
Enfin nous allons supprimer le cache local, et relancer la construction de notre projet :
rm -rf ~/.m2/repository
cd ~/esup-hello
mvn clean install
Comme lors de la toute premire excution, Maven va tlcharger toutes ses dpendances ainsi que
celles de notre projet, mais cette fois en passant par Nexus qui va automatiquement les mettre en
cache. Vous pouvez parcourir le dpt Nexus en vous y connectant (Firefox dispose d'un raccourci
Nexus) avec le compte admin/admin et en choisissant le repository Public.
5.2 Dploiement
Nous souhaitons maintenant mettre disposition d'autres dveloppeurs notre module esup-hello en
le publiant dans notre repository d'entreprise. Pour cela, nous devons dans un premier temps
indiquer dans le fichier pom.xml de notre projet o nous allons le publier :
<distributionManagement>
<repository>
<id>local-nexus-release</id>
<name>Nexus local (releases)</name>
<url>http://localhost:9080/content/repositories/releases/</url>
</repository>
<snapshotRepository>
<id>local-nexus-snapshot</id>
<name>Nexus local (snapshots)</name>
<url>http://localhost:9080/content/repositories/snapshots/</url>
</snapshotRepository>
</distributionManagement>
<servers>
<server>
<id>local-nexus-release</id>
<username>admin</username>
<password>admin</password>
</server>
<server>
<id>local-nexus-snapshot</id>
<username>admin</username>
<password>admin</password>
</server>
</servers>
Modifiez ensuite votre projet pour changer sa version en 1.0.0-SNAPSHOT. Lancez la tche maven
deploy. Lancez la une seconde fois et allez voir dans le repository correspondant le rsultat. Puis
remettez la version en 1.0.0 et tentez des dploiements successifs.
6 Parent / Module
Maven offre deux options intressantes pour les dveloppeurs travaillant en collaboration sur des
projets complexes. La premire est la possibilit de dvelopper un mta-projet (de type POM) duquel
hriteront une srie d'autres projets. Il est ainsi possible de dfinir des proprits, des dpendances
et des comportements au niveau du projet parent qui seront partags par tous les projets fils. Il reste
bien entendu possible au niveau de chaque enfant de surcharger ce qui a t dfini au niveau du
parent.
La seconde possibilit offerte est celle des modules. La gestion de modules permet uniquement un
raccourci au dveloppeur, cest--dire pouvoir excuter une tche Maven sur une srie de projets qui
sont indpendants.
Enfin il est trs souvent courant de combiner ces deux fonctionnalits pour obtenir un mta-projet
de type POM incluant lui-mme des modules fils. Attention, il reste ncessaire de bien distinguer ce
qui dcoule de l'utilisation d'un parent de ce qui vient d'un dveloppement sous forme de module.
Il est noter que ces projets sont interdpendants au sens Maven (et Java) du terme :
cd
unzip Bureau/esup-user.zip
Il n'est pas possible de construire la main un projet modulaire, en effet Eclipse ne gre pas de sous-
projets directement inclus dans un autre projet (au sens filesystem). Le plugin Maven triche pour
obtenir ce rsultat : il cre un projet Eclipse par module (y compris le module parent) et gre ensuite
des dpendances inter-projet (au sens Eclipse).
Cliquez sur File > Import et choisissez l'option Maven > Existing Maven Projects puis pointez sur le
rpertoire racine du projet esup-user. Si l'import se droule correctement, vous devriez rcuprer les
cinq modules dcrits plus haut.
Examinez le fichier pom.xml du module parent (esup-user) et notez les diffrences par rapport aux
chapitres prcdents :
Examinez le fichier pom.xml d'un autre module (par exemple esup-user-domain) et reprez la section
parent dcrivant le pre de ce module. Vous noterez galement que certaines informations dfinies
dans le module parent n'ont pas besoin d'tre redfinies dans le module fils (certaines dpendances,
section distributionManagement, certaines proprits et enfin certains plugins).
Clic-droit sur le projet esup-user > Run as > Maven build puis choisissez la tche deploy. Maven
vous prsente un compte-rendu module par module de l'chec ou du succs de l'opration.
Nous allons maintenant dployer notre module Web dans un Tomcat local. Pour cela, ralisez les
oprations suivantes :
Les fichiers les plus mme d'tre filtrs sont ceux prsents dans le dossier
src/main/resources, nous allons donc surcharger la dfinition de ce dossier dans le fichier
pom.xml du projet parent :
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
Nous pouvons ds lors utiliser des proprits de la forme ${variable} dans les fichiers du rpertoire
src/main/resources. Commenons par le fichier log4j.xml du projet esup-user-web en rendant
configurable le niveau et le type de log :
<root>
<level value="${log4j.level}" />
<appender-ref ref="${log4j.appender}" />
</root>
</log4j:configuration>
<properties>
<log4j.level>info</log4j.level>
<log4j.appender>console-appender</log4j.appender>
</properties>
Une fois ces modifications apportes, relancez la construction du projet et vrifiez que ces
modifications sont bien prises en compte.
<properties>
<log4j.level>info</log4j.level>
<log4j.appender>file-appender</log4j.appender>
<log4j.file>${catalina.base}/logs/${artifactId}.log</log4j.file>
...
</properties>
Commenons par reprendre notre fichier pom.xml pour lui ajouter notre nouveau profil :
<profiles>
<profile>
<id>devel</id>
<properties>
<log4j.level>debug</log4j.level>
<log4j.appender>console-appender</log4j.appender>
</properties>
</profile>
</profiles>
<properties>
<log4j.level>error</log4j.level>
<log4j.appender>file-appender</log4j.appender>
<log4j.file>${catalina.base}/logs/${artifactId}.log</log4j.file>
</properties>
Nous n'avons surcharg dans notre profil que les variables spcifiques celui-ci. Toutes les autres
sont hrites du profil par dfaut (les proprits prsentes de base dans notre fichier pom.xml).
Maven doit connatre le profil activer lors de la construction du projet : clic-droit > Run as > Maven
build :
Chaque tche Maven excute doit dsormais tre accompagne de l'activation explicite du profil
devel, mais il est possible de conditionner son activation automatique (par exemple sur la prsence
d'un fichier la racine du projet) :
<profiles>
<profile>
<id>devel</id>
<activation>
<file>
<exists>devel</exists>
</file>
</activation>
<properties>
<log4j.level>debug</log4j.level>
<log4j.appender>console-appender</log4j.appender>
</properties>
</profile>
</profiles>
Crez un fichier vide devel la racine du projet esup-user et relancez un la tche package,
attention dans le cas d'un projet multi-module l'existence d'un fichier est teste par rapport au
module pre et non par rapport au module dfinissant le profil.
Nous allons pour terminer externaliser les proprits lies la configuration de notre application
dans des fichiers distincts. Pour cela commenons par crer un fichier default.properties la
racine du module esup-user-web :
log4j.level=error
log4j.appender=file-appender
log4j.file=${catalina.base}/logs/${artifactId}.log
log4j.level=debug
log4j.appender=console-appender
Il reste modifier notre fichier pom.xml pour supprimer la dfinition actuelle des proprits log4j
et pour dclarer nos filtres externes la fois dans la balise build situe la racine et dans celle du
profil spcifique :
<build>
<filters>
<filter>default.properties</filter>
</filters>
</build>
<profiles>
<profile>
<id>devel</id>
<activation>
<file>
<exists>devel</exists>
</file>
</activation>
<build>
<filters>
<filter>devel.properties</filter>
</filters>
</build>
</profile>
</profiles>
8 Archtypes
Dans cette dernire partie, nous allons crer un archtype cest--dire un mta-projet Maven qui
servira de modle pour la cration de futurs projets du mme type.
Maven Project
Create a simple project (skip archetype selection)
Group Id : org.esupportail
Artifact Id : esup-war-archetype
Version : 1.0.0-SNAPSHOT
Packaging : jar
Name : esup-war-archetype
Validez
Supprimez le dossier src/test
Supprimez le dossier src/main/java
Crez un dossier src/main/resources/META-INF/maven
Le fichier de configuration principal d'un archtype s'appelle archetype.xml et doit se trouver dans ce
dernier dossier cr, crons ce fichier :
<archetype xmlns="http://maven.apache.org/plugins/maven-archetype-
plugin/archetype/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-archetype-
plugin/archetype/1.0.0 http://maven.apache.org/xsd/archetype-1.0.0.xsd">
<id>esup-war-archetype</id>
</archetype>
<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>org.esupportail</groupId>
<artifactId>esup-war-archetype</artifactId>
<version>1.0.0-SNAPSHOT</version>
<name>esup-war-archetype</name>
<distributionManagement>
<repository>
<id>local-nexus-release</id>
<name>Nexus local (releases)</name>
<url>http://localhost:9080/content/repositories/releases/</url>
</repository>
<snapshotRepository>
<id>local-nexus-snapshot</id>
<name>Nexus local (snapshots)</name>
<url>http://localhost:9080/content/repositories/snapshots/</url>
</snapshotRepository>
</distributionManagement>
</project>
Nous devons maintenant dfinir quel sera le contenu du projet cible de notre archtype. Pour rappel,
l'archtype permet de construire un projet Maven qui serait pr-rempli et pr-paramtr avec des
choix par dfauts. Le premier fichier important est donc le futur pom.xml du projet. Pour cela, nous
allons crer un fichier src/main/resources/archetype-resources/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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>${groupId}</groupId>
<artifactId>${artifactId}</artifactId>
<version>${version}</version>
<packaging>war</packaging>
<name>${artifactId}</name>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
</plugins>
</build>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>
Bien entendu, tout projet qui utilisera notre archtype aura sa propre identification Maven
(groupId, artifactId, version) qui sera spcifi la cration du projet. C'est pourquoi on
trouve ici des variables qui seront automatiquement remplaces lors de la construction.
Il ne reste plus qu' dployer notre archtype dans notre repository local (dans un premier temps)
afin qu'il soit disponible pour crer de nouveaux projets.
cd
mvn archetype:generate -DarchetypeCatalog=local
Si tout s'est bien droul prcdemment, vous devriez pouvoir choisir l'archtype esup-war-
archetype. Vous devez alors saisir les informations concernant le projet que vous voulez
construire savoir son groupId, son artifactId, sa version et enfin le package Java racine.
Pour information, la cration d'un projet partir d'un archtype est faite en mode dconnect, cest-
-dire que si l'archtype vient tre mis jour par la suite, les changements ne seront pas rpercuts
dans le projet qui en dcoule. Un projet cr par archtype ne garde aucune trace des particularits
de sa cration, et il est tout fait possible de casser ce que l'archtype a construit par la suite.
A noter que par dfaut, Eclipse utilise un archtype mme si vous n'en spcifiez pas. Il y a un
archtype simple pour chaque type de packaging (JAR, WAR, POM).
<sources>
<source>src/main/java/Hello.java</source>
</sources>
<resources>
<resource filtered="true">src/main/resources/log4j.xml</resource>
</resources>
A noter que les fichiers qui seront placs dans les ressources peuvent tre filtrs par rapport des
proprits dfinies dans le fichier pom.xml de l'archtype.