Jump to >


PMD is a static analysis tool that provides a variety of checkers for many languages.

Supported File Types

The following are supported by this tool:

  • Apex: *.cls

  • C/C++: *.c, *.cc, *.cpp, *.cxx, *.C, *.h, *.hpp, *.hxx

  • C#: *.cs

  • Dart: *.dart

  • Fortran: *.f, *.f66, *.f77, *.f90, *.for

  • Go: *.go

  • Groovy: *.groovy

  • Java: *.java

  • JavaScript: *.js

  • Java Server Pages: *.jsp, *.jspf, *.jspx, *.tag

  • Kotlin: *.kt

  • Lua: *.lua

  • Matlab: *.m

  • Modelica: *.mo

  • Objective-C: *.h, *.m

  • Perl: *.plm, *.pm, *.t

  • PHP: *.class, *.php

  • PL/SQL: *.fnc, *.pkb, *.pkh, *.pks, *.plb, *.pld, *.plh, *.pls, *.prc, *.sql, *.tpb, *.tps, *.trg, *.tyb, *.typ

  • Python: *.py

  • Ruby: *.cgi, *.class, *.rb

  • Scala: *.scala

  • Swift: *.swift

  • VisualForce: *.component, *.page

  • VM: *.vm

  • XML: *.xml

It may also scan other file extensions to see if they appear to be one of the languages above.

PMD can be configured to match only specific file types.


PMD can be installed through many system package managers, or downloaded and installed manually.


PMD Location

Because there are a variety of methods to install PMD, there’s no consistent location (or name) of the PMD executable. If installed through a package manager, it can often be invoked via pmd. If installed manually, it’s invoked via run.sh.

If it’s not named pmd, or can’t be found in Review Bot’s PATH environment variable, then you’ll need to specify the path in the Review Bot worker config file:

exe_paths = {
    'pmd': '/path/to/pmd',

You will need to restart the Review Bot worker after making this change.


This setting was renamed in Review Bot 3.0.

In Review Bot 2.0, this setting was called pmd_path. For consistency, the old setting was deprecated in 3.0, and will be removed in 4.0.

See Review Bot 3.0 Configuration Changes.

Enabling PMD in Review Board

First, you’ll need to add a Review Bot configuration in Review Board (see Tool Configurations).

The following configuration options are available:

Rulesets (required):

This can be one of the following:

  1. A comma-separated list of PMD rulesets to apply (equivalent to pmd -rulesets ...).

  2. A full PMD ruleset configuration file (starting with <?xml ...?>).

Scan files (optional):

A comma-separated list of file extensions to scan. Only files in the diff that match these file extensions will trigger the PMD configuration.

If not provided, the tool will be ran for all files in the diff.

For example: c,js,py