Analyse de la qualité du code Java avec JDepend
Implémentation
JDepend 2.9 est à ce jour la derniè version de JDepend.
Cette distribution contient un fichier jar, le code source de l'outil, son API et un exemple d'application.
Télécharger JDepend
La dernière version de JDepend est téléchargeable ici
Installer JDepend
Windows
Pour installer JDepend sous Windows, il suffit de suivre les étapes suivantes :
- Décompression de l´archive jdepend-<version>.zip dans un répertoire
- Ajout en variable d´environnement du répertoire : set CLASSPATH=%CLASSPATH%;%JDEPEND_HOME%\lib\jdepend-<version>.jar
Unix
Pour installer JDepend sous Unix, il suffit de suivre les étapes suivantes :
- Ajout en variable d´environnement du répertoire : JDEPEND_HOME=~/chemin/jdepend-<version>
- Ajout en variable d´environnement de l´archive jar contenant les classes : export CLASSPATH=$CLASSPATH:$JDEPEND_HOME/lib/jdepend.jar
- Recompilation cd $JDEPEND_HOME
chmod -R a+x $JDEPEND_HOME
ant jar
Lancer JDepend
JDepend fournit des interfaces utilisateur graphique, textuelle et XML
Interface graphique
L'interface graphique affiche un arbre hiérachique des dépendances ascendantes et descendantes de chacun des packages java analysés.
Pour lancer JDepend avec la présentation des métriques sous forme d'interface graphique, il faut utiliser la syntaxe suivante :
-
java jdepend.swingui.JDepend [-components <components>]
<directory> [directory2...n]
Par exemple, pour analyser tous les fichiers .class du répertoire $JDEPEND_HOME/build, on lancera la commande:
-
java jdepend.swingui.JDepend $JDEPEND_HOME/build
Interface textuelle
L'interface textuelle affiche les métriques, les dépendances et les cycles pour chaque package java analysé. Pour faciliter l'import de ces métriques dans d'autres applications par CSV, l'interface propose une zone de résumé regroupant ces informations séparées par des points-virgules.
Pour lancer JDepend avec la présentation des métriques sous forme textuelle, il faut utiliser la syntaxe suivante :
-
java jdepend.textui.JDepend [-components
<components>][-file <ouput> file=""]
directory [directory2...n]
Par exemple, pour analyser tous les fichiers .class du répertoire $JDEPEND_HOME/build, on lancera la commande:
-
java jdepend.textui.JDepend -file report.txt
$JDEPEND_HOME/build
Interface xml
Cette interface contient les mêmes informations que l'interface textuelle, mais permettra une meilleure intégration avec d'autres outils.
Pour lancer JDepend avec la présentation des métriques sous forme XML, il faut utiliser la syntaxe suivante :
-
java jdepend.xmlui.JDepend [-components
<components>][-file ouput file=""]
<directory> [directory2...n]
Par exemple, pour analyser tous les fichiers .class du répertoire $JDEPEND_HOME/build, on lancera la commande:
-
java jdepend.xmlui.JDepend -file report.xml
$JDEPEND_HOME/build
Configuration de JDepend
JDepend peut être configuré en utilisants des options en ligne de commande et/ou par la création d'un fichier jdepend.properties dans le répertoire racine de l'utilisateur ou dans n'importe quel répertoire contenu dans le classpath.
Composants
JDepend peut calculer des métriques et des dépendances pour les composants d'une arborescence de packages, un package pouvant contenir un ou plusieurs sous-packages.
Par exemple si on consid&eagrave;re la hierarchie de packages suivante :
-
com.xyz.package_a.subpackage_a
com.xyz.package_a.subpackage_b
com.xyz.package_a.subpackage_c
com.xyz.package_b.subpackage_a
com.xyz.package_b.subpackage_b
On imagine vouloir uniquement collecter les métriques et dépendances pour les packages com.xyz.package_a et com.xyz.package_b, sans calculer celles de leurs sous-packages. Par exemple, si il y a une dépendance entre les packages com.xyz.package_a.subpackage_a et com.xyz.package_b.subpackage_b, et qu'on veut la faire figurer en tant qu'une dépendance entre le packages com.xyz.package_a et com.xyz.package_b.subpackage_b, on utilisera l'option -components en ligne de commande suivante:
-
java jdepend.textui.JDepend -components com.xyz.package_a,com.xyz.package_b /path/to/classes
Filtrages des packages
JDepend ignorera tous les noms de packages spécifiés en tant que valeur "ignore" dans le fichier jdepend.properties. Par défaut, aucun package n'est filtré.
L'exemple suivant montre comment configurer le fichier jdepend.properties pour ignorer les noms de packages préfixés par java,javax,sun,com.sun ainsi que le package com.xyz.tests :
ignore.java=java.*,javax.*
ignore.sun=sun.*,com.sun.*
ignore.tests=com.xyz.tests
Les packages peuvent aussi être ignorés par la création d'une instance de la classe PackageFilter définissant les filtres puis en la passant au constructeur de JDepend :
PackageFilter filter = new PackageFilter();
filter.addPackage("java.*");
filter.addPackage("javax.*");
JDepend jdepend = new JDepend(filter);
On peut aussi créer une ArryList de filtres :
Collection filters = new ArrayList();
filters.add("java.*");
filters.add("javax.*");
PackageFilter filter = new PackageFilter(filters);
JDepend jdepend = new JDepend(filter);
Volatilité
Les packages qui ne sont pas susceptibles d'être modifiés peuvent être spécifiquement configurés avec une valeur de volatilité (métrique V) imposée dans le fichier jdepend.properties. Si V=0, cela signifiera que le package n'est sujet ˆ aucun changement. Dans ce cas la métrique prendra la valeur 0. Si V=1, cela signifiera que le package va encore évolué. Dans ce cas la métrique D ne sera pas affectée. (configuration par défaut).
Exemple : Positionnement de la volatilité du package java.lang ˆ 0
java.lang=0
ou
JavaPackage javaLang = new JavaPackage("java.lang");
javaLang.setVolatility(0);
// or
JavaPackage javaLang = new JavaPackage("java.lang", 0);
JDepend jdepend = new JDepend();
jdepend.addDirectory("/path/to/classes");
jdepend.addPackage(javaLang);
jdepend.analyze();
Inner classes
Par défaut les inner classes sont analysées. Pour ne pas les analyser, il suffit d'ajouter la ligne suivante dans le fichier jdepend.properties :
analyzeInnerClasses=false