Résumé

Checkstyle est un outil d'analyse de source configurable. En l'intégrant à ses projets, cela facilite l'uniformisation des conventions de programmation. Cet article présente un manière d'intégrer cet outil

Présentation de l'outil

Checkstyle est un outil d'analyse de code source Java configurable. Son but est de vérifier qu'un code source respecte les conventions de programmation choisies pour le projet. Cela contribue à une meilleure lisibilité du code, ce qui peut permettre de faciliter la compréhension du code et sa maintenance.

Intégration de l'outil

Checkstyle peut être piloté par ant. On va donc utiliser cette méthode de préférence à des plug-in pour les environnement intégrés, afin de s'affranchir de l'environnement de développement. Afin de pouvoir réutiliser l'intégration dans tous les projets à vérifier, on va utiliser les mécanismes d'importations de ant. L'intégration de checkstyle se décomposera donc en les étapes suivantes

  1. Préparation d'un dépôt pour la définition de nouvelles tâches ant
  2. Définition de la tâche checkstyle, initialisation de valeurs par défaut, et fichiers par défaut (règles et feuille de style XSL)
  3. Intégration de la tâche checkstyle à un projet ant existant
  4. Appel de la tâche checkstyle

Préparation d'un dépôt pour la définition de nouvelles tâches ant

Créer un répertoire __Tasks situé au même endroit que le répertoire de votre projet. Créer le sous-répertoire checkstyle. Copier dans ce dernier répertoire le ficher checkstyle-all-<version>.jar.

Définition de la tâche checkstyle, initialisation de valeurs par défaut, et fichiers par défaut (règles et feuille de style XSL)

La dernière version de Ant permettent l'importation de scripts. On prépare donc un tel script, sauvegardé dans __Tasks sous le nom import_checkstyle.xml. Ici on utilise la version 4.10 beta de checkstyle.

<?xml version="1.0"?>
<project name="checkstyle" basedir="." default="default">
	<dirname property="checkstyle.basedir" file="${ant.file.checkstyle}"/>
	<taskdef resource="checkstyletask.properties" classpath="${checkstyle.basedir}/checkstyle/checkstyle-all-4.0-beta1.jar"/>
	<property name="default.checkstyle.conf" value="${checkstyle.basedir}/checkstyle/sporniket_style.xml"/>
	<property name="default.checkstyle.xsl" value="${checkstyle.basedir}/checkstyle/checkstyle_simple_report.xsl"/>
	
	<target name="default"/>
</project>

La variable default.checkstyle.conf référence un fichier de règles que checkstyle va vérifier. Checkstyle est livré avec un fichier de règles permettant de suivre les règles édictées par Sun, l'éditeur du language Java. On peut donc utiliser ce fichier comme base de travail.

La variable default.checkstyle.xsl référence un fichier de transformation xslt pour transformer un rapport XML de checkstyle en autre chose, généralement une page web, grace à la tache ant style. Voici un exemple très simple de transformation, qui affiche pour chaque fichier les erreurs détectées.

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
	<xsl:template match="checkstyle">
	  <html>
	  <head>
	  	<title>Rapport d'erreur de checkstyle</title>
	  </head>
	  <body>
	  	<h1>Rapport d'erreur de checkstyle</h1>
	  	<p>Nombre d'erreurs : <xsl:value-of select="count(file/error)"/></p>
	  	<p>Proportion de fichiers avec erreurs : <xsl:value-of select="count(file[count(error)>0])"/>/<xsl:value-of select="count(file)"/></p>
	  	<dl>
	  		<xsl:apply-templates/>
	  	</dl>
	  </body>
	  </html>
	</xsl:template>

	<xsl:template match="file">
	</xsl:template>

	<xsl:template match="file[count(error)>0]">
		<dt><a>
			<xsl:attribute name="href"><xsl:value-of select="@name"/></xsl:attribute>
			<xsl:value-of select="@name"/>
		</a></dt>
		<xsl:apply-templates/>
	</xsl:template>

	<xsl:template match="error">
		<dd><em><xsl:value-of select="@severity"/> Ligne <xsl:value-of select="@line"/></em> : <xsl:value-of select="@message"/></dd>
		<xsl:apply-templates/>
	</xsl:template>
</xsl:stylesheet>

Intégration de la tâche checkstyle à un projet ant existant

Rajouter simplement la directive suivante dans votre script ant :

<import file="../__Tasks/import_checkstyle.xml"/>

Appel de la tâche checkstyle

Voici un exemple d'utilisation de la tache checkstyle, avec la génération d'un rapport xml qui est ensuite transformé en rapport html.

	<property name="build.src" value="src"/>
	<property name="build.compile" value="bin"/>
	<property name="build.dest" value="build"/>
	<property name="build.report" value="reports"/>
	<property name="build.tmp" value="tmp"/>
	<property name="javadoc.dest" value="doc"/>
	<property name="project" value="sporniket_core_base"/>



	<!-- 
	=========================================================== 
	Audit the code
	-->
	<target name="audit">
		<checkstyle config="${default.checkstyle.conf}" failureProperty="checkstyle.failure" failOnViolation="false">
			<fileset dir="${build.src}" includes="**/*.java"/>
		    <!-- Location of cache-file. Something that is project specific -->
			<property key="checkstyle.cache.file" file="${build.tmp}/cachefile"/>
			<formatter type="xml" toFile="${build.report}/${project}.xml"/>
		</checkstyle>
		<style in="${build.report}/${project}.xml" out="${build.report}/${project}.html" style="${default.checkstyle.xsl}"/>
	</target>

Correction de bogues...

Le 17 Août 2005 à 23:39

Apparemment Internet Explorer n'aimait pas mon image utilisée en bandeau...

Citation du jour

Le 04 Août 2005 à 15:50

Prenez un homme sur un cheval (je parle en connaissance de cause: j'ai fait du cheval presque toute ma vie); eh bien c'est la plupart un homme affable, mais un changement radical se produit des qu'il enfourche sa monture. Tout homme à cheval devient arrogant, aussi aimable soit t'il lorsque qu'il est à pied. L'homme dans sa voiture est mille fois plus dangereux. Je vous le dis: Si jamais l'automobile venait à se généraliser, cela engendrait un égoïsme terrible chez l'être humain. Cela entraînerait une violence dans des proportions que nous n'avons encore jamais connues: Ce serait la fin de la famille telle que nous l'avons connue: trois ou quatre générations partageant avec bonheur le même foyer. Cela anéantirait nos relations avec notre voisinage et l'idée même de la communauté. Nous verrions de gigantesques villes se créer comme des cancers, des banlieue résidentielles à la fausse opulence, une campagne aux paysages ruinés, des agglomérations encerclées par des usines destructrices pour la santé, des fermes industrielles spécialisées. Cela ferait de chaque homme un tyran.

R.A Lafferty fin XIX em siècle