Analyse de code avec maven
Par Francois Wauquier le vendredi 20 novembre 2009, 19:54 - Java - Lien permanent
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.
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>
