Les trois outils les plus aboutis dans ce domaine, sont CheckStyle, PMD, et FindBugs.

CheckStyle et fait principalement des vérifications formelles sur le code source

  • présence de javadoc
  • présence de blocs vide (catch dans lesquels on ne fait rien, etc.)
  • variables, imports ou méthodes inutilisées
  • méthodes trop complexes (imbrication de blocs) ou trop longues
  • indentation, aération du code, lignes de code trop longues
  • etc.

FindBugs, quant à lui, se concentre plus sur la sémantique du code, en détectant des "patterns de mauvaise programmation":

  • flux ouverts qui ne sont pas fermés dans tous les cas (lorsqu'une exception survient, par exemple)
  • risques de NullPointerException
  • tests redondants
  • failles de sécurité
  • etc.

PMD enfin, se situe à la limite entre les deux outils précédents: il effectue à la fois des vérifications formelles et fonctionnelles. Par rapport à CheckStyle, PMD est capable de faire des vérifications globales sur le code (là où CheckStyle fait de la vérification fichier par fichier). Il dispose ainsi par exemple d'un module très appréciable permettant de détecter globalement les codes copiés-collés.

Ces outils ont maintenant atteint un stade de maturité avancé, et ils s'intègrent très bien dans les environnements de développement professionnels:

  • ils sont entièrement paramétrables: on peut choisir les règles applicables au projet, paramétrer celles qui existent (taille limite des méthodes), voire développer des règles personnalisées si celles fournies par défaut ne suffisent pas. Cela permet au chef de projet de fixer le niveau de qualité qu'il souhaite pour son application.
  • il existe des plugins permettant d'intégrer directement ces outils dans les IDE du marché. Le code est ainsi vérifié "en temps réel", au moment où il est écrit: il peut donc être corrigé au plus tôt dans le processus de développement (donc pour le coût le plus faible).
  • ils s'intègrent automatiquement dans les processus de déploiement (avec les outils Ant ou Maven), afin de générer automatiquement des rapports sur le code remonté sur le gestionnaire de configuration.

Je noterai également JDepend, qui permet de détecter les dépendances cycliques entre classes.

J'ai présenté ici les outils qui me paraissent les plus importants. Mais on peut aller plus loin, et il existe de nombreux autres outils qu'on peut mettre en place sur un projet. Une liste plus complète des outils qui peuvent être intégrés automatiquement sur un projet géré par Maven est disponible sur Agile Swiss.