The tool comes with a rather extensive help text, simply running with
|Option||Description||Default value||Applies to|
||Required Path to a ruleset xml file. The path may reference a resource on the classpath of the application, be a local file system path, or a URL. The option can be repeated, and multiple arguments separated by comma can be provided to a single occurrence of the option.|
||Path to a source file, or directory containing
source files to analyze. Zip and Jar files are
also supported, if they are specified directly
(archive files found while exploring a directory
are not recursively expanded). This option can be
repeated, and multiple arguments can be provided
to a single occurrence of the option. One of
||Output format of the analysis report. The available formats are described here.||
||Specifies the classpath for libraries used by the source code.
This is used to resolve types in source files. The platform specific path delimiter
(":" on Linux, ";" on Windows) is used to separate the entries.
Alternatively, a single
||Enables benchmark mode, which outputs a benchmark report upon completion. The report is sent to standard error.|
||Specify the location of the cache file for incremental analysis. This should be the full path to the file, including the desired file name (not just the parent directory). If the file doesn't exist, it will be created on the first run. The file will be overwritten on each run with the most up-to-date rule violations. This can greatly improve analysis performance and is highly recommended.|
||Debug mode. Prints more log output. See also Logging.|
||Specifies the character set encoding of the source code files PMD is reading.
The valid values are the standard character sets of
||Specifies whether PMD exits with non-zero status if violations are found.
By default PMD exits with status 4 if violations are found.
Disable this feature with
||Path to a file containing a list of files to
analyze, one path per line. One of
||Force a language to be used for all input files, irrespective of
file names. When using this option, the automatic language selection
by extension is disabled and PMD tries to parse all files with
the given language
This option allows to use the xml language for files, that don't use xml as extension. See example below.
||Path to file containing a list of files to ignore, one path per line.
This option overrides files included by any of
||Display help on usage.|
||The specific language version PMD should use when parsing source code for a given language.
Values are in the format of language-version.
This option can be repeated to configure several languages for the same run.
Note that this option does not change how languages are assigned to files.
It only changes something if the project you analyze contains some files that PMD detects as the given language.
Language detection is only influenced by file extensions and the
See also Supported Languages.
||Specify the language PMD should use. Used together with
Deprecated since PMD 6.52.0. Use
||Rule priority threshold; rules with lower priority than configured here won't be used. Valid values (case insensitive): High, Medium_High, Medium, Medium_Low, Low. An integer between 1 (High) and 5 (Low) is also supported. See Configuring rules on how to override priorities in custom rulesets.||
||Disable automatic fixing of invalid rule references. Without the switch, PMD tries to automatically replace rule references that point to moved or renamed rules with the newer location if possible. Disabling it is not recommended.|
||Explicitly disables incremental analysis. This switch turns off suggestions to use Incremental Analysis,
and causes the
||Enables / disable progress bar indicator of live analysis progress. This ie enabled by default.|
||Specifies a property for the report renderer. The option can be specified several times.
||Path relative to which directories are rendered in the report. This option allows shortening directories in the report; without it, paths are rendered as mentioned in the source directory (option "--dir"). The option can be repeated, in which case the shortest relative path will be used. If the root path is mentioned (e.g. "/" or "C:\\"), then the paths will be rendered as absolute.|
||Path to a file to which report output is written. The file is created if it does not exist. If this option is not specified, the report is rendered to standard output.|
||Causes the suppressed rule violations to be added to the report.|
||Specifies the comment token that marks lines which PMD should ignore.||
||Sets the number of threads used by PMD.
Set threads to
||Database URI for sources. One of
Additional Java Runtime Options
PMD is executed via a Java runtime. In some cases, you might need to set additional runtime options, e.g. if you want to analyze a project, that uses one of OpenJDK’s Preview Language Features.
Just set the environment variable
PMD_JAVA_OPTS before executing PMD, e.g.
Additional runtime classpath
If you develop custom rules and package them as a jar file, you need to add it to PMD’s runtime classpath.
You can either copy the jar file into the
lib/ subfolder alongside the other jar files, that are in PMD’s
Or you can set the environment variable
CLASSPATH before starting PMD, e.g.
Please note that if PMD detects any violations, it will exit with status 4 (since 5.3). This behavior has been introduced to ease PMD integration into scripts or hooks, such as SVN hooks.
|0||Everything is fine, no violations found.|
|1||PMD exited with an exception.|
|2||Usage error. Command-line parameters are invalid or missing.|
|4||At least one violation has been detected, unless |
PMD internally uses slf4j and ships with slf4j-simple as the logging implementation.
Logging messages are printed to System.err, that’s why you should use
--report-file to specify an output for
the report and not rely on redirecting the console output.
The configuration for slf4j-simple is in the file
conf/simplelogger.properties. There you can enable
logging of specific classes if needed. The
--debug command line option configures the default log level
to be “debug”.
The language is determined automatically by PMD from the file extensions. Some languages such as “Java”
however support multiple versions. The default version will be used, which is usually the latest supported
non-preview version. If you want to use an older version, so that e.g. rules that suggest usage of language features
that are not available yet won’t be executed, you need to specify a specific version via the
The selected language version can also influence which rules are applied. Some rules might be relevant for
just a specific version of the language. Such rules are marked with either
maximumLanguageVersion or both. Most rules apply for all language versions.
These parameters are most of the time irrelevant, if the rules apply for all versions.
The available versions depend on the language. You can get a list of the currently supported language versions
via the CLI option
- apex (Salesforce Apex)
- pom (Maven POM)
- vf (Salesforce VisualForce)
- vm (Apache Velocity)
Available Report Formats
PMD comes with many different renderers. All formats are described at PMD Report formats
Analyze other xml formats
If your xml language doesn’t use
xml as file extension, you can still use PMD with
You can also specify a directory instead of a single file. Then all files are analyzed. In that case, parse errors are suppressed in order to reduce irrelevant noise:
Alternatively, you can create a filelist to only analyze files with a given extension: