Introdução ao PMD

Introdução ao PMD

1. Visão geral

Simplificando,PMD é um analisador de código-fonte para encontrar falhas de programação comuns, como variáveis ​​não utilizadas, blocos de captura vazios, criação desnecessária de objetos e assim por diante.

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

Neste artigo, vamos nos concentrar em como usar o PMD para realizar análises estáticas em um projeto Java.

2. Pré-requisitos

Vamos começar configurando o PMD em um projeto Maven - usando e configurando omaven-pmd-plugin:


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

Você pode encontrar a versão mais recente demaven-pmd-pluginhere.

Observe como estamos adicionando conjuntos de regras na configuração aqui - esses são um caminho relativo para já definir as regras da biblioteca central PMD.

Finalmente, antes de executar tudo, vamos criar uma classe Java simples com alguns problemas gritantes - algo que o PMD pode começar a relatar problemas:

public class Ct {

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

3. Executar PMD

Com a configuração simples do PMD e o código de amostra - vamos gerar um relatório na pasta de destino da compilação:

mvn site

O relatório gerado é denominadopmd.html e está localizado na pastatarget/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. O relatório mostra violações e números de linha em seu código Java, de acordo com PMD.

4. Conjuntos de regras

O plug-in PMD usa cinco conjuntos de regras padrão:

  • basic.xml

  • empty.xml

  • imports.xml

  • unnecessary.xml

  • unusedcode.xml

Você pode usar outros conjuntos de regras ou criar seus próprios conjuntos de regras e configurá-los no 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
                    
                
            
        
    

Observe que estamos usando um endereço relativo, um endereço absoluto ou até mesmo um URL - como o valor do valor 'conjunto de regras' na configuração.

Uma estratégia limpa para personalizar quais regras usar para um projeto éwrite a custom ruleset file. Nesse arquivo, podemos definir quais regras usar, adicionar regras personalizadas e personalizar quais regras incluir / excluir dos conjuntos de regras oficiais.

5. Conjunto de regras personalizadas

Vamos agora escolher as regras específicas que queremos usar dos conjuntos de regras existentes no PMD - e também personalizá-las.

Primeiro, vamos criar um novo arquivoruleset.xml. É claro que podemos usar um dos arquivos de conjuntos de regras existentes como exemplo e copiá-los e colá-los em nosso novo arquivo, excluir todas as regras antigas e alterar o nome e a descrição:



    
        This ruleset checks my code for bad stuff
    

Em segundo lugar, vamos adicionar algumas referências de regra:


Ou adicione algumas regras específicas:




Podemos personalizar a mensagem e a prioridade da regra:


    2

E você também pode personalizar o valor da propriedade de uma regra como este:


    
        
    

Observe que você pode personalizar regras referenciadas individuais. Tudo, exceto a classe da regra, pode ser substituído em seu conjunto de regras personalizado.

Em seguida - você também pode excluir regras de um conjunto de regras:


    
    

Next – you can also exclude files from a ruleset usando padrões de exclusão, com um padrão de inclusão de substituição opcional.

Um arquivo será excluído do processamento quando houver um padrão de exclusão correspondente, mas nenhum padrão de inclusão correspondente.

Os separadores de caminho no caminho do arquivo de origem são normalizados para serem o caractere '/', para que o mesmo conjunto de regras possa ser usado em várias plataformas de forma transparente.

Além disso, essa técnica de exclusão / inclusão funciona independentemente de como o PMD é usado (por exemplo, linha de comando, IDE, Ant), facilitando a aplicação consistente das regras de PMD em todo o ambiente.

Aqui está um exemplo rápido:



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

6. Conclusão

Neste rápido artigo, apresentamos o PMD - uma ferramenta flexível e altamente configurável focada na análise estática do código Java

Como sempre, o código completo apresentado neste tutorial está disponívelover on Github.