PMD

Description

Runs a set of static code analysis rules on some Java source code files and generates a list of problems found.

Parameters

AttributeDescriptionRequired
formatterSpecifies the format of and the files to which the report is written. Formats can be of type 'xml', 'text', 'csv', 'papari', 'summaryhtml', or 'html', filenames can be either relative or absolute, and you can supply a "linkPrefix" for linking to online HTMLized source (like this). See example belows.Yes
rulesetfilesA comma delimited list of ruleset files ('rulesets/basic.xml,rulesets/design.xml'). If you write your own ruleset files, you can put them on the classpath and plug them in here.Yes, unless the ruleset nested element is used
failonerrorWhether or not to fail the build if any errors occur while processing the filesNo
failOnRuleViolationWhether or not to fail the build if PMD finds any problemsNo
A nested classpath elementAlso accepts a nested classpath element so you can specify custom ruleset files more easily. See the example below.No
printToConsoleWhether or not to print any problems found to the Ant log/consoleNo
shortFilenamesPlaces truncated filenames in the report. This can reduce your report file size by 15%-20%.No
targetjdkTarget JDK 1.3, 1.4, or 1.5. "1.4" is the default.No
failuresPropertyNameA property name to plug the number of rule violations into when the task finishesNo
encodingThe character set encoding (i.e., UTF-8) to use when reading the source code filesNo
excludemarkerThe series of characters to use to tell PMD to skip lines - the default is NOPMD.No

Examples

Running one ruleset to produce a HTML report


<taskdef name="pmd" classname="net.sourceforge.pmd.ant.PMDTask"/>

<target name="pmd">
    <taskdef name="pmd" classname="net.sourceforge.pmd.ant.PMDTask"/>
    <pmd rulesetfiles="rulesets/imports.xml">
        <formatter type="html" toFile="pmd_report.html"/>
        <fileset dir="C:\j2sdk1.4.1_01\src\java\lang\">
            <include name="**/*.java"/>
        </fileset>
    </pmd>
</target>

Running multiple rulesets to produce an XML report


<taskdef name="pmd" classname="net.sourceforge.pmd.ant.PMDTask"/>

<target name="pmd">
    <taskdef name="pmd" classname="net.sourceforge.pmd.ant.PMDTask"/>
    <pmd rulesetfiles="rulesets/imports.xml,rulesets/unusedcode.xml">
        <formatter type="xml" toFile="c:\pmd_report.xml"/>
        <fileset dir="C:\j2sdk1.4.1_01\src\java\lang\">
            <include name="**/*.java"/>
        </fileset>
    </pmd>
</target>

Using a custom renderer


<taskdef name="pmd" classname="net.sourceforge.pmd.ant.PMDTask"/>

<target name="pmd">
    <pmd rulesetfiles="rulesets/favorites.xml">
        <formatter type="com.mycompany.MyRenderer" toFile="foo.html"/>
        <fileset dir="/path/to/java/src">
            <include name="**/*.java"/>
        </fileset>
    </pmd>
</target>

Using a classpath reference in the taskdef


<path id="pmd.classpath">
    <pathelement location="${build}"/>
    <fileset dir="/path/to/my/pmd/lib/">
        <include name="*.jar"/>
    </fileset>
</path>

<taskdef name="pmd" classname="net.sourceforge.pmd.ant.PMDTask" classpathref="pmd.classpath"/>

<target name="pmd">
      <pmd rulesetfiles="rulesets/favorites.xml">
          <formatter type="net.sourceforge.pmd.renderers.HTMLRenderer" toFile="foo.html"/>
          <fileset dir="/path/to/java/src">
              <include name="**/*.java"/>
          </fileset>
      </pmd>
  </target>

Getting verbose output


[tom@hal bin]$ ant -v pmd
Apache Ant version 1.6.2 compiled on July 16 2004
Buildfile: build.xml
Detected Java version: 1.4 in: /usr/local/j2sdk1.4.2_03/jre
Detected OS: Linux
parsing buildfile build.xml with URI = file:/home/tom/data/pmd/pmd/bin/build.xml
Project base dir set to: /home/tom/data/pmd/pmd
Build sequence for target `pmd' is [pmd]
Complete build sequence is [pmd, copy, cppjavacc, cpd, delete,
 compile, clean, jar, dist, cpdjnlp, jjtree, javadoc, test, tomserver]

pmd:
      [pmd] Using the normal ClassLoader
      [pmd] Using these rulesets: rulesets/imports.xml
      [pmd] Using rule DontImportJavaLang
      [pmd] Using rule UnusedImports
      [pmd] Using rule ImportFromSamePackage
      [pmd] Using rule DuplicateImports
      [pmd] Processing file /usr/local/java/src/java/lang/ref/Finalizer.java
      [pmd] Processing file /usr/local/java/src/java/lang/ref/FinalReference.java
      [pmd] Processing file /usr/local/java/src/java/lang/ref/PhantomReference.java
      [pmd] Processing file /usr/local/java/src/java/lang/ref/Reference.java
      [pmd] Processing file /usr/local/java/src/java/lang/ref/ReferenceQueue.java
      [pmd] Processing file /usr/local/java/src/java/lang/ref/SoftReference.java
      [pmd] Processing file /usr/local/java/src/java/lang/ref/WeakReference.java
      [pmd] 0 problems found

BUILD SUCCESSFUL
Total time: 2 seconds
[tom@hal bin]$

An HTML report with the "linkPrefix" gizmo


<target name="pmd">
  <taskdef name="pmd" classname="net.sourceforge.pmd.ant.PMDTask"/>
  <pmd rulesetfiles="rulesets/imports.xml" shortFilenames="true">
      <formatter type="html" toFile="pmd_report.html" linkPrefix="http://pmd.sourceforge.net/xref/"/>
      <fileset dir="/usr/local/j2sdk1.4.1_01/src/">
          <include name="java/lang/*.java"/>
      </fileset>
  </pmd>
</target>

Using the ruleset nested element


<target name="pmd">
  <taskdef name="pmd" classname="net.sourceforge.pmd.ant.PMDTask"/>
  <pmd shortFilenames="true">
       <ruleset>rulesets/favorites.xml</ruleset>
       <ruleset>rulesets/basic.xml</ruleset>
      
      <formatter type="html" toFile="pmd_report.html" linkPrefix="http://pmd.sourceforge.net/xref/"/>
      <fileset dir="/usr/local/j2sdk1.4.1_01/src/">
          <include name="java/lang/*.java"/>
      </fileset>
  </pmd>
</target>