Introducción a PMD

1. Información general

En pocas palabras, PMD es un analizador de código fuente para encontrar fallas de programación comunes como variables no utilizadas, bloques de captura vacíos, creación de objetos innecesarios, etc.

Es compatible con Java, JavaScript, Salesforce.com Apex, PLSQL, Apache Velocity, XML, XSL.

En este artículo, nos centraremos en cómo utilizar PMD para realizar análisis estáticos en un proyecto Java.

2. Requisitos previos

Comencemos por configurar PMD en un proyecto de Maven, usando y configurando el complemento maven-pmd-plugin :

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

Puede encontrar la última versión de maven-pmd-plugin aquí.

Observe cómo estamos agregando conjuntos de reglas en la configuración aquí: estas son una ruta relativa para definir reglas de la biblioteca principal de PMD.

Finalmente, antes de ejecutar todo, creemos una clase Java simple con algunos problemas evidentes, algo sobre lo que PMD puede comenzar a informar problemas:

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

3. Ejecute PMD

Con la configuración simple de PMD y el código de muestra, generemos un informe en la carpeta de destino de la compilación:

mvn site

El informe generado se llama pmd.html y se encuentra en la carpeta 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 

Como puede ver, no estamos obteniendo resultados. El informe muestra violaciones y números de línea en su código Java, según PMD.

4. Conjuntos de reglas

El complemento PMD utiliza cinco conjuntos de reglas predeterminados:

  • basic.xml
  • vacío.xml
  • imports.xml
  • innecesario.xml
  • unusedcode.xml

Puede utilizar otros conjuntos de reglas o crear sus propios conjuntos de reglas y configurarlos en el complemento:

 ...    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       

Observe que estamos usando una dirección relativa, una dirección absoluta o incluso una URL, como el valor del 'conjunto de reglas' en la configuración.

Una estrategia clara para personalizar las reglas que se utilizarán en un proyecto es escribir un archivo de conjunto de reglas personalizado . En este archivo, podemos definir qué reglas usar, agregar reglas personalizadas y personalizar qué reglas incluir / excluir de los conjuntos de reglas oficiales.

5. Conjunto de reglas personalizado

Ahora elijamos las reglas específicas que queremos usar de los conjuntos de reglas existentes en PMD, y también las personalizamos.

Primero, crearemos un nuevo archivo ruleset.xml . Por supuesto, podemos usar uno de los archivos de conjuntos de reglas existentes como ejemplo y copiarlo y pegarlo en nuestro nuevo archivo, eliminar todas las reglas antiguas y cambiar el nombre y la descripción:

   This ruleset checks my code for bad stuff  

En segundo lugar, agreguemos algunas referencias a las reglas:

O agregue algunas reglas específicas:

Podemos personalizar el mensaje y la prioridad de la regla:

 2  

Y también puede personalizar el valor de propiedad de una regla de esta manera:

Tenga en cuenta que puede personalizar reglas de referencia individuales. Todo menos la clase de la regla se puede anular en su conjunto de reglas personalizado.

A continuación, también puede excluir reglas de un conjunto de reglas:

A continuación, también puede excluir archivos de un conjunto de reglas utilizando patrones de exclusión, con un patrón de inclusión anulado opcional.

Un archivo se excluirá del procesamiento cuando haya un patrón de exclusión coincidente, pero no un patrón de inclusión coincidente.

Los separadores de ruta en la ruta del archivo de origen se normalizan para ser el carácter '/', por lo que el mismo conjunto de reglas se puede usar en múltiples plataformas de forma transparente.

Además, esta técnica de exclusión / inclusión funciona independientemente de cómo se utilice PMD (por ejemplo, línea de comandos, IDE, Ant), lo que facilita la coherencia de la aplicación de las reglas de PMD en todo el entorno.

He aquí un ejemplo rápido:

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

6. Conclusión

En este artículo rápido, presentamos PMD, una herramienta flexible y altamente configurable centrada en el análisis estático de código Java.

Como siempre, el código completo presentado en este tutorial está disponible en Github.