##### Overview

- Download PMD 3.9
- What's new in PMD 3.9
- PMD in the news
- PMD-related products and books
- Best practices
- Future directions
- Similar projects
- Credits
- License
- What does 'PMD' mean?

##### Usage

- Installation
- Command line usage
- Ant task usage
- Maven plugin usage
- IDE plugin usage
- Suppressing warnings
- Finding duplicated code
- JSP support

##### Customizing PMD

- Compiling PMD
- How to write a rule
- Writing XPath rules
- How to make a rule set
- How it works

##### For example

- Run PMD on a Sourceforge project

##### Rule Sets

- Index
- Basic
- Braces
- Code Size
- Clone
- Controversial
- Coupling
- Design
- Finalizers
- Import Statements
- J2EE
- Javabeans
- JUnit Tests
- Logging (Java)
- Logging (Jakarta)
- Migrating
- Naming
- Optimizations
- Strict Exceptions
- Strings
- Sun Security
- Unused Code
- Java Server Pages
- Java Server Faces

##### Project Documentation

- About PMD
- Project Info
- Project Reports
- Development Process

## Running PMD via command line

- Type pmd [filename|jar or zip file containing source code|directory] [report format] [ruleset file], i.e:

    C:\tmp\pmd-3.9\pmd\bin>pmd c:\data\pmd\pmd\test-data\Unused1.java xml rulesets/unusedcode.xml
    <?xml version="1.0"?><pmd>
    <file name="c:\data\pmd\pmd\test-data\Unused1.java">
    <violation line="5" rule="UnusedLocalVariable">
    Avoid unused local variables such as 'fr'
    </violation>
    </file></pmd>

    C:\tmp\pmd-3.9\pmd\bin>

You can pass a file name, a directory name, or a jar or zip file name containing Java source code to PMD.

Also, the PMD binary distribution includes the ruleset files inside the jar file - even though the "rulesets/unusedcode.xml" parameter above looks like a filesystem reference, it's really being used by a getResourceAsStream() call to load it out of the PMD jar file. And the same applies to the example below.

- If you are want to run PMD without the batch file, you can do a:

    C:\data\pmd\pmd>java -cp lib\pmd-3.9.jar;lib\jaxen-1.1-beta-10.jar;lib\asm-3.0.jar;lib\backport-util-concurrent.jar
                         net.sourceforge.pmd.PMD
                         c:\j2sdk1.4.1_01\src\java\lang xml
                         rulesets/imports.xml

- Notice that in this case the output is in XML, so you can redirect it to a file and XSLT it or whatever
- You can also use shortened names to refer to the built-in rulesets, like this:

    java net.sourceforge.pmd.PMD /path/to/source text basic,imports,unusedcode

- The command line interface also accepts the following optional arguments:

- `-debug` - prints a stacktrace if an error is encountered
- `-shortnames` - puts shortened names in the report. This only works if the filename argument is a single directory
- `-targetjdk [1.3|1.4|1.5|1.6]` - selects either JDK 1.3, 1.4, 1.5 or 1.6 language compatibility; default is 1.4
- `-encoding Cp1252` - uses the specified encoding for reading the source code files
- `-excludemarker NOPMDFORME` - uses the specified string of characters as the marker for PMD to ignore. The default string is "NOPMD".
- `-linkprefix` - path to HTML source, for summary html renderer only.
- `-lineprefix` - custom anchor to affected line in the source file, for summary html renderer only.
- `-minimumpriority` - The rule priority threshold; rules with lower priority than they will not be used.