Intro
Maven,
outil de build que l’on ne présente plus, nous rend encore un immense service
en nous proposant de générer un site de présentation du projet.
J’aimerais
dans cet article vous montrer les différents rapports de code que l’on peut
ainsi agréger et déployer, afin de présenter le projet ou pour en
améliorer la qualité.
Je vous
propose d’utiliser comme exemple un projet Open source hébergé sur googlecode,
nommé gwt-mvc http://code.google.com/p/gwt-mvc/, choisi au hasard J
Voici le
résultat : http://gwt-mvc.googlecode.com/svn/site/0.3/index.html
Rapports
Voici les
différents plugins utilisés :
maven-project-info-reports-plugin http://maven.apache.org/plugins/maven-project-info-reports-plugin/
Plugin principal du site, permet de sélectionner
les rapports de base
maven-javadoc-plugin http://maven.apache.org/plugins/maven-javadoc-plugin/
Génère la javadoc du projet.
maven-jxr-plugin http://maven.apache.org/plugins/maven-jxr-plugin/
Présente le code source avec des liens entre les
classes, afin de pouvoir naviguer dans le code en dehors d’un IDE, pratique
pour les projets Open Source.
maven-surefire-report-plugin http://maven.apache.org/plugins/maven-surefire-plugin/
Rapport de passage des tests
unitaires.
maven-pmd-plugin http://maven.apache.org/plugins/maven-pmd-plugin/
Rapport de code avec PMD. Cela permet de vérifier la conformité du code avec des règles
de codage prédéfinies. Ces règles peuvent être très poussées, mais la plus
représentative est "Dans un block catch, si une exception est relancées,
elle doit être construite avec l'exception intiale en tant que cause". Inclus
également le rapport Copy Past Duplication, mettant en avant les duplications
de code. Il est même possible de bloquer le build en cas de non-respect de
règle.
cobertura-maven-plugin http://mojo.codehaus.org/cobertura-maven-plugin/
Rapport de couverture de test.
maven-dependency-plugin http://maven.apache.org/plugins/maven-dependency-plugin/
Analyse des dépendances directes et indirectes, et
distinction des dépendances : utilisée directement mais sans déclaration
(directe), déclarées mais non utilisées.
versions-maven-plugin http://mojo.codehaus.org/versions-maven-plugin/
Rapport de mise à jour des dépendances et des
plugins.
dashboard-maven-plugin http://mojo.codehaus.org/dashboard-maven-plugin/
Agrège les
résultats de certains des rapports précédents, et les présente avec de jolis
graphiques.
Intégration à Eclipse
Ces
rapports étant éloignés de l’IDE, l’idéal est de pouvoir retrouver ces mêmes
résultats au plus près du code, afin d’avoir deux outils complémentaires.
M2clipse http://m2eclipse.sonatype.org/ http://m2eclipse.sonatype.org/update/
Ce plugin
permettra à Eclipse d’interpréter la configuration maven afin de compiler le
projet.
JUnit
Intégré
nativement à Eclipse, il vous permet de passer vos tests unitaires.
Eclemma http://www.eclemma.org/ http://update.eclemma.org/
Eclemma vous permet d’obtenir votre couverture de
test en utilisant emma. (Cobertura etait utilisé dans les rapports)
PMD http://pmd.sourceforge.net/ http://pmd.sourceforge.net/eclipse
Permet
d’effectuer les contrôles du respect des règles de codage. Il est important de
configurer ces outils avec le même ruleset, et de choisir avec précaution ces
règles.
Ici, j’ai
utilisé les règles proposées par le plugin PMD eclipse.
Conseils
Fixer les
numéros de versions des plugins utilisés, afin d’avoir un build répétable.
Placer vos
mots de passe dans les fichiers .settings, pas dans le pom, ou alors choisissez
le mode interactif (vos identifiants vous seront demandés pendant
l’execution).
Trucs et astuces
Pour
afficher l’arbre des dependances de votre projet :
mvn
dependency:tree
(Inclus
dans le rapport « Dependencies » mais tellement pratique)
Pour savoir
si vous utilisez la dernière version de vos plugins (y compris les rapports)
:
mvn
versions:display-plugin-updates
(Inclus
dans le rapport « Plugin Updates Report »)
Problèmes rencontrés
J’aurais
aimé pouvoir faire le site-deploy en une seule fois, mais wagon-svn ne fournit
pas encore l’option qui permet de spécifier un fichier de configuration appellé
auto-props, permettant d’associer un mime-type à une extension de fichier.
https://wagon-svn.dev.java.net/issues/show_bug.cgi?id=4
J’ai donc
été obligé de générer le site dans un premier temps, puis de modifier les
propriétés mime-type dans un second temps.
Recherche d’ artifact
Je vous
conseille également les sites suivants pour « retrouver » des artifacts, leurs
différentes versions, et sur quel repository ils sont disponibles.
http://merobase.com/
http://mvnrepository.com/
http://www.mvnbrowser.com/
Il existe
des dizaines de sites proposant ce service, mais ceux-là ont un truc en plus,
je vous laisse les découvrir.
Sources
http://beta.parleys.com/#sl=1&st=5&id=625
http://maven.apache.org/guides/mini/guide-site.html
http://blog.fastconnect.fr/?p=275
Bonne
génératon de site.
Pom.xml
<?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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.googlecode.gwt-mvc</groupId>
<artifactId>gwt-mvc</artifactId>
<version>0.3</version>
<packaging>jar</packaging>
<name>gwt-mvc</name>
<description>
gwt-mvc Project, an MVC layer on Google Web Toolkit
</description>
<url>http://code.google.com/p/gwt-mvc/</url>
<licenses>
<license>
<name>The
Apache Software License, Version 2.0</name>
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
<distribution>gwt-mvc-repository</distribution>
</license>
</licenses>
<repositories>
<repository>
<id>maven2-repository.dev.java.net</id>
<name>Java.net
Repository for Maven</name>
<url>http://download.java.net/maven/2/</url>
</repository>
<repository>
<id>gwt-maven-repository</id>
<url>
http://gwt-maven.googlecode.com/svn/trunk/mavenrepo
</url>
</repository>
</repositories>
<scm>
<!--
http://maven.apache.org/scm/subversion.html -->
<connection>
scm:svn:http://gwt-mvc.googlecode.com/svn/trunk/gwt-mvc
</connection>
<developerConnection>
scm:svn:https://${username}:${password}@gwt-mvc.googlecode.com/svn/trunk/gwt-mvc
</developerConnection>
<url>http://code.google.com/p/gwt-mvc/source/browse/</url>
</scm>
<distributionManagement>
<repository>
<id>gwt-mvc-repository</id>
<url>svn:https://gwt-mvc.googlecode.com/svn/repository</url>
</repository>
<site>
<id>gwt-mvc-site</id>
<url>
svn:https://gwt-mvc.googlecode.com/svn/site/${version}
</url>
</site>
</distributionManagement>
<build>
<extensions>
<extension>
<groupId>org.jvnet.wagon-svn</groupId>
<artifactId>wagon-svn</artifactId>
<version>1.9</version>
</extension>
</extensions>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.5</source>
<target>1.5</target>
<compilerVersion>1.5</compilerVersion>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>com.google.gwt</groupId>
<artifactId>gwt-user</artifactId>
<version>1.6.4</version>
<scope>provided</scope>
</dependency>
<!--
ControllerTestCase compilation -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.jmock</groupId>
<artifactId>jmock</artifactId>
<version>2.5.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.jmock</groupId>
<artifactId>jmock-legacy</artifactId>
<version>2.5.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
<reporting>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>
maven-project-info-reports-plugin
</artifactId>
<reportSets>
<reportSet>
<reports>
<report>index</report>
<report>licence</report>
<report>dependencies</report>
<report>plugin-management</report>
<report>plugins</report>
<report>summary</report>
<report>scm</report>
</reports>
</reportSet>
</reportSets>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>2.6</version>
<reportSets>
<reportSet>
<reports>
<report>javadoc</report>
<!--
<report>test-javadoc</report> -->
</reports>
</reportSet>
</reportSets>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jxr-plugin</artifactId>
<version>2.1</version>
<reportSets>
<reportSet>
<reports>
<report>jxr</report>
<!--
<report>test-jxr</report>-->
</reports>
</reportSet>
</reportSets>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-report-plugin</artifactId>
<version>2.4.3</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-pmd-plugin</artifactId>
<version>2.4</version>
<configuration>
<targetJdk>1.5</targetJdk>
<rulesets>
<ruleset>/pmd/pmd-plugin-rules.xml</ruleset>
</rulesets>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>cobertura-maven-plugin</artifactId>
<version>2.3</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>versions-maven-plugin</artifactId>
<version>1.1</version>
<reportSets>
<reportSet>
<reports>
<report>dependency-updates-report</report>
<report>plugin-updates-report</report>
<!--
<report>property-updates-report</report>-->
</reports>
</reportSet>
</reportSets>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>dashboard-maven-plugin</artifactId>
<version>1.0.0-beta-1</version>
</plugin>
</plugins>
</reporting>
</project>