Introduction à la PMD

Introduction à la PMD

1. Vue d'ensemble

En termes simples,PMD est un analyseur de code source pour trouver les failles de programmation courantes telles que les variables inutilisées, les blocs catch vides, la création d'objets inutiles, etc.

Il prend en charge Java, JavaScript, Salesforce.com Apex, PLSQL, Apache Velocity, XML, XSL.

Dans cet article, nous allons nous concentrer sur l'utilisation de PMD pour effectuer une analyse statique dans un projet Java.

2. Conditions préalables

Commençons par configurer PMD dans un projet Maven - en utilisant et en configurant lesmaven-pmd-plugin:


    ...
    
        
            
                org.apache.maven.plugins
                maven-pmd-plugin
                3.7
                
                    
                        /rulesets/java/braces.xml
                        /rulesets/java/naming.xml
                    
                
            
        
    

Vous pouvez trouver la dernière version demaven-pmd-pluginhere.

Remarquez comment nous ajoutons des ensembles de règles dans la configuration ici - il s'agit d'un chemin relatif pour déjà définir des règles à partir de la bibliothèque principale de PMD.

Enfin, avant de tout exécuter, créons une classe Java simple avec des problèmes flagrants - quelque chose sur lequel PMD peut commencer à signaler des problèmes:

public class Ct {

    public int d(int a, int b) {
        if (b == 0)
            return Integer.MAX_VALUE;
        else
            return a / b;
    }
}

3. Exécutez PMD

Avec la configuration PMD simple et l'exemple de code, générons un rapport dans le dossier cible de construction:

mvn site

Le rapport généré est appelépmd.html et se trouve dans le dossiertarget/site:

Files

com/example/pmd/Cnt.java

Violation                                                                             Line

Avoid short class names like Cnt                                   1–10
Avoid using short method names                                  3
Avoid variables with short names like b                        3
Avoid variables with short names like a                        3
Avoid using if...else statements without curly braces 5
Avoid using if...else statements without curly braces 7

As you can see – we’re not getting results. Le rapport affiche les violations et les numéros de ligne dans votre code Java, selon PMD.

4. Ensembles de règles

Le plugin PMD utilise cinq jeux de règles par défaut:

  • basic.xml

  • empty.xml

  • imports.xml

  • unnecessary.xml

  • unusedcode.xml

Vous pouvez utiliser d'autres ensembles de règles ou créer vos propres ensembles de règles et les configurer dans le plug-in:


    ...
    
        
            
                org.apache.maven.plugins
                maven-pmd-plugin
                3.7
                
                    
                        /rulesets/java/braces.xml
                        /rulesets/java/naming.xml
                        /usr/pmd/rulesets/strings.xml
                        http://localhost/design.xml
                    
                
            
        
    

Notez que nous utilisons une adresse relative, une adresse absolue ou même une URL - comme valeur de la valeur "ensemble de règles" dans la configuration.

Une stratégie propre pour personnaliser les règles à utiliser pour un projet consiste à utiliserwrite a custom ruleset file. Dans ce fichier, nous pouvons définir les règles à utiliser, ajouter des règles personnalisées et personnaliser les règles à inclure / exclure des jeux de règles officiels.

5. Ensemble de règles personnalisées

Choisissons maintenant les règles spécifiques que nous voulons utiliser parmi les ensembles de règles existants dans PMD - et personnalisons-les également.

Tout d'abord, nous allons créer un nouveau fichierruleset.xml. Nous pouvons, bien sûr, utiliser l’un des fichiers de jeux de règles existants à titre d’exemple et le copier-coller dans notre nouveau fichier, en supprimer toutes les anciennes règles et en modifier le nom et la description:



    
        This ruleset checks my code for bad stuff
    

Deuxièmement, ajoutons quelques références de règles:


Ou ajouter des règles spécifiques:




Nous pouvons personnaliser le message et la priorité de la règle:


    2

Et vous pouvez également personnaliser la valeur de propriété d'une règle comme ceci:


    
        
    

Notez que vous pouvez personnaliser des règles référencées individuellement. Tout, sauf la classe de la règle, peut être remplacé dans votre jeu de règles personnalisé.

Ensuite, vous pouvez également exclure des règles d'un ensemble de règles:


    
    

Next – you can also exclude files from a ruleset utilisant des modèles d'exclusion, avec un modèle d'inclusion de remplacement facultatif.

Un fichier sera exclu du traitement s'il existe un modèle d'exclusion correspondant, mais aucun modèle d'inclusion correspondant.

Les séparateurs de chemin dans le chemin du fichier source sont normalisés avec le caractère "/", de sorte que le même jeu de règles peut être utilisé de manière transparente sur plusieurs plates-formes.

De plus, cette technique d’exclusion / inclusion fonctionne quelle que soit la façon dont la PMD est utilisée (par exemple, ligne de commande, IDE, Ant), ce qui facilite la cohérence de l’application de vos règles PMD dans votre environnement.

Voici un exemple rapide:



    My ruleset
    .*/some/package/.*
    
       .*/some/other/package/FunkyClassNamePrefix.*
    
    .*/some/package/ButNotThisClass.*
    ...

6. Conclusion

Dans cet article rapide, nous avons présenté PMD, un outil flexible et hautement configurable axé sur l'analyse statique du code Java.

Comme toujours, le code complet présenté dans ce tutoriel est disponibleover on Github.