Introduzione a PMD

1. Panoramica

In poche parole, PMD è un analizzatore di codice sorgente per trovare difetti di programmazione comuni come variabili inutilizzate, blocchi catch vuoti, creazione di oggetti non necessari e così via.

Supporta Java, JavaScript, Salesforce.com Apex, PLSQL, Apache Velocity, XML, XSL.

In questo articolo, ci concentreremo su come utilizzare PMD per eseguire analisi statiche in un progetto Java.

2. Prerequisiti

Cominciamo con la configurazione di PMD in un progetto Maven, utilizzando e configurando il plug-in maven-pmd :

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

Puoi trovare l'ultima versione di maven-pmd-plugin qui.

Nota come stiamo aggiungendo set di regole nella configurazione qui: si tratta di un percorso relativo per definire già le regole dalla libreria principale di PMD.

Infine, prima di eseguire tutto, creiamo una semplice classe Java con alcuni problemi evidenti, qualcosa su cui PMD può iniziare a segnalare problemi:

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

3. Eseguire PMD

Con la semplice configurazione PMD e il codice di esempio, generiamo un rapporto nella cartella di destinazione della build:

mvn site

Il report generato si chiama pmd.html e si trova nella cartella target / site :

Files com/baeldung/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 

Come puoi vedere, non stiamo ottenendo risultati. Il report mostra le violazioni e i numeri di riga nel codice Java, secondo PMD.

4. Set di regole

Il plug-in PMD utilizza cinque set di regole predefinite:

  • basic.xml
  • empty.xml
  • imports.xml
  • inutile.xml
  • unusedcode.xml

È possibile utilizzare altri set di regole o creare i propri set di regole e configurarli nel plug-in:

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

Si noti che stiamo utilizzando un indirizzo relativo, un indirizzo assoluto o persino un URL, come valore del valore "set di regole" nella configurazione.

Una strategia pulita per personalizzare le regole da utilizzare per un progetto consiste nello scrivere un file di set di regole personalizzato . In questo file, possiamo definire quali regole utilizzare, aggiungere regole personalizzate e personalizzare quali regole includere / escludere dalle regole ufficiali.

5. Set di regole personalizzate

Ora scegliamo le regole specifiche che vogliamo utilizzare dai set di regole esistenti in PMD e personalizziamole anche.

Innanzitutto, creeremo un nuovo file ruleset.xml . Possiamo, ovviamente, utilizzare uno dei file dei set di regole esistenti come esempio e copiarlo e incollarlo nel nostro nuovo file, eliminare tutte le vecchie regole da esso e modificare il nome e la descrizione:

   This ruleset checks my code for bad stuff  

In secondo luogo, aggiungiamo alcuni riferimenti alle regole:

Oppure aggiungi alcune regole specifiche:

Possiamo personalizzare il messaggio e la priorità della regola:

 2  

E puoi anche personalizzare il valore della proprietà di una regola in questo modo:

Notare che è possibile personalizzare singole regole di riferimento. Tutto tranne la classe della regola può essere sovrascritto nel tuo set di regole personalizzato.

Successivamente, puoi anche escludere regole da un set di regole:

Avanti: puoi anche escludere file da una serie di regole utilizzando modelli di esclusione, con un modello di inclusione opzionale che sostituisce.

Un file verrà escluso dall'elaborazione quando è presente un modello di esclusione corrispondente, ma nessun modello di inclusione corrispondente.

I separatori di percorso nel percorso del file di origine sono normalizzati per essere il carattere "/", quindi lo stesso set di regole può essere utilizzato su più piattaforme in modo trasparente.

Inoltre, questa tecnica di esclusione / inclusione funziona indipendentemente da come viene utilizzato PMD (ad es. Riga di comando, IDE, Ant), rendendo più facile mantenere coerente l'applicazione delle regole PMD in tutto l'ambiente.

Ecco un rapido esempio:

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

6. Conclusione

In questo rapido articolo, abbiamo introdotto PMD, uno strumento flessibile e altamente configurabile incentrato sull'analisi statica del codice Java

Come sempre, il codice completo presentato in questo tutorial è disponibile su Github.