Maven 2, démarrage rapide
1- installation de maven (dézipper) -> C:\Program Files\maven
2- changement de C:\Program Files\maven\conf\settings.xml pour configurer le repository local -> d:\repository
=> configuration pour l'ensemble des projets
3- création d'un artefact (projet java) par :
mvn archetype:create -DgroupId=topad2.fr.impots.gouv -DartifactId=Service
pour une appli web :
mvn archetype:create -DgroupId=topad2.fr.impots.gouv -DartifactId=Service -DarchetypeArtifactId=maven-archetype-webapp
=> crée un répertoire webapp et un fichier web.xml
Attention : pas besoin de créer un répertoire, il crée lui-même un répertoire Service.
Facile de faire des projets multi-modules.
Commencer par le répertoire père (exemple commun), en le définissant de type pom.
Puis en entrant dans ce répertoire, créer les différents modules fils, ils seront automatiquement rajoutés comme modules fils de commun.
mvn eclipse:eclipse sur commun, ajoutera automatiquement la conf eclipse à tous les modules fils.
Remarque : 1 artefact par couche (par projet eclipse)
4- créer un projet eclipse à partir de l'artefact -> mvn eclipse:eclipse
5- modifier dans eclipse > windows préférences > Maven installation > User settings (y mettre le fichier settings.xml du poste)
6- ajout dans pom.xml le fait de compiler en jdk1.5 (si on utilise les annotations p. ex.)
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
</plugin>
</plugins>
</build>
7- pour les test, on peut avoir besoin de modifier le plugin surefire pour inclure des fichiers qui ne se terminent pas par Test.
Ajout dans le pom.xml de :
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skip>false</skip>
<testFailureIgnore>true</testFailureIgnore>
<includes>
<include>**/*Tests.java</include>
</includes>
</configuration>
</plugin>
8- gérer les conflits en passant par le diagramme des graphes de dépendance ou de hierarchie du plugin Eclipse
Ex : on ne veut pas qu'Hibernate ramène sa dépendance de commons-logging
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate</artifactId>
<version>3.2.5.ga</version>
<scope>compile</scope>
<exclusions>
<!-- dépendance gérée par spring -->
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
9- si l'on a plusieurs artefacts (ex : a dépend de b qui dépend de c), il faut faire mvn install sur c, puis sur b, avant de pouvoir compiler a.
10 - modifier pom pour spécifier le repository distant où stocker les artefacts
<distributionManagement>
<repository>
<id>springsource-repository</id>
<name>SpringSource Repository</name>
<url>file://C:/cours-maven/remote-repository/release</url>
</repository>
<snapshotrepository> <!-- si gestion différentes snapshots & releases -->
<id>snap-springsource-repository</id>
<name>snap-SpringSource Repository</name>
<url>file://C:/cours-maven/remote-repository/snapshot</url>
</snapshotrepository>
</distributionManagement>
11- si manque de mémoire (p. ex. pour lancer PMD)
set MAVEN_OPTS=-Xmx256m en DOS (ou en variable système?)
Vocabulaire :
------------------
Faire la différence entre l'héritage de projet (module parent/fils) et les sous-module.
Dans le 1er cas, on veut factoriser des propriétés.
Dans le 2ème cas, on veut que l'appel d'un goal sur un module se lance sur ses sous-modules.
Maven décrit des phases, qui s'enchaînent séquentiellement (cf. liste complète en annexe).
Pour les atteindre, il faut utiliser des goals de plugin.
Utilitaires :
------------
- mvn {nom-plugin}:{nom-goal}
- mvn help:effective-pom => liste l'ensemble du pom hérité et explicite du projet courant
- mvn help:effective-settings => liste la configuration du fichier settings.xml
- mvn help:describe -Dplugin=help => décrit l'aide du plugin help
- mvn help:describe -Dplugin=help -Dgoal=describe => affichage de l'aide du goal describe du plugin help
- mvn help:describe -DgroupId=org.apache.maven.plugins -DartifactId=maven-surefire-plugin
ANNEXES
-------
A - Eclipse
Dans eclipse, pour avoir un projet java avec le classpath géré par Maven :
dans .project :
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.maven.ide.eclipse.maven2Nature</nature>
</natures>
dans .classpath :
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" output="target/classes" path="src/main/java"/>
<classpathentry kind="src" output="target/test-classes" path="src/test/java"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="con" path="org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER"/>
<classpathentry kind="output" path="target/classes"/>
</classpath>
B - propriétés dans pom
<properties>
<spring.version>2.5.6</spring.version>
</properties>
...
<version>${spring.version}</version>
C - héritage de propriétés dans un pom père
pom père :
<groupId>com.springsource.applications</groupId>
<artifactId>abstractProject</artifactId>
<packaging>pom</packaging> <!-- => spécifie que c'est un pom "abstrait" -->
<dependencies>
...
pom fils :
<parent>
<groupId>com.springsource.applications</groupId>
<artifactId>abstractProject</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
puis ajouter des dépendances dans le pom père (et commun à tous les fils) :
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
ou bien ajouter des dépendances optionnelles dans le pom père :
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
dans ce cas, le fils n'a qu'à rajouter ceci s'il utilise la dépendance :
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
</dependencies>
ou gestion multi-modules :
dans pom père :
<modules>
<module>rewardsWeb</module>
</modules>
il faut qu'il y ait un répertoires sous le répertoire père, avec le nom rewardsWeb et géré par Maven
D- Exemple configuration Checkstyle
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
<version>2.4</version>
<configuration>
<configLocation>src/main/resources/rewards-checkstyle.xml</configLocation>
</configuration>
</plugin>
E- Exemple configuration PMD
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-pmd-plugin</artifactId>
<version>2.3</version>
<configuration>
<linkXref>true</linkXref>
<targetJdk>1.6</targetJdk>
</configuration>
</plugin>
Voici la liste complète des phases pour un projet maven 2.2 :
— validate vérifie les prérequis d'un projet Maven (utiliser le goal validate)
— generate-sources
— process-sources
— generate-resources
— process-resources
— compile compilation du code source (utiliser le goal compiler:compile)
— process-classes
— generate-test-sources
— process-test-sources
— generate-test-resources
— process-test-resources
— test-compile compilation des classes de test (compiler:test-compile)
— test lancement des tests unitaires (utiliser le goal surefire:test)
— prepare-package
— package assemble le code compilé en un livrable (utiliser le goal package ou jar:jar)
— integration-test
— verify
— install installe le livrable sur son référentiel local (utiliser le goal install:install)
— deploy déploie le livrable sur un référentiel distant (ex: Nexus), pour partage avec d'autres projets (utiliser le goal deploy:deploy)
Voir les 3 cycles de vies :
- clean
- default
- site
https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html#Lifecycle_Reference
Référence officielle
http://maven-guide-fr.erwan-alliaume.com/maven-guide-fr/site/reference/public-book.html