pmd/pmd_userdocs_tools_ant.html

2393 lines
65 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="">
<meta name="keywords" content="userdocstools, ">
<title>Ant Task Usage | PMD Source Code Analyzer</title>
<link rel="stylesheet" type="text/css" href="assets/fontawesome-free-5.15.4-web/css/all.min.css">
<link rel="stylesheet" type="text/css" href="assets/bootstrap-4.5.2-dist/css/bootstrap.min.css">
<link rel="stylesheet" type="text/css" href="css/syntax.css">
<link rel="stylesheet" type="text/css" href="css/modern-business.css">
<link rel="stylesheet" type="text/css" href="css/customstyles.css">
<link rel="stylesheet" type="text/css" href="css/theme-green.css">
<link rel="stylesheet" type="text/css" href="css/pmd-customstyles.css">
<link rel="shortcut icon" href="images/logo/favicon.ico" type="image/x-icon">
<link rel="icon" href="images/logo/favicon.ico" type="image/x-icon">
<link rel="alternate" type="application/rss+xml" title="" href="feed.xml">
</head>
<body>
<!-- Content is offset by the height of the topnav bar. -->
<!-- There's already a padding-top rule in modern-business.css, but it apparently doesn't work on Firefox 60 and Chrome 67 -->
<div id="topbar-content-offset">
<!-- Navigation -->
<nav class="navbar navbar-expand-lg fixed-top navbar-dark">
<div class="container topnavlinks">
<a class="navbar-brand fas fa-home fa-lg" href="index.html">&nbsp;<span class="projectTitle"> PMD Source Code Analyzer Project</span></a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav mr-auto mt-2 mt-lg-0"></ul>
<ul class="navbar-nav">
<!-- toggle sidebar button -->
<li class="nav-item"><a id="tg-sb-link" class="nav-link" href="#"><i id="tg-sb-icon" class="fas fa-toggle-on"></i> Nav</a></li>
<!-- entries without drop-downs appear here -->
<li class="nav-item"><a class="nav-link" href="https://github.com/pmd/pmd/releases/latest" target="_blank">Download</a></li>
<li class="nav-item"><a class="nav-link" href="https://github.com/pmd/pmd" target="_blank">Fork us on github</a></li>
<!-- entries with drop-downs appear here -->
<!-- conditional logic to control which topnav appears for the audience defined in the configuration file.-->
</ul>
<form class="form-inline my-2 my-lg-0">
<input class="form-control mr-sm-2" type="search" placeholder="search..." id="search-input">
<ul id="results-container"></ul>
</form>
</div>
</div>
</nav>
<!-- Page Content -->
<div class="container-toc-wrapper">
<div class="container">
<div class="col-lg-12">&nbsp;</div>
<!-- Content Row -->
<div class="row">
<!-- Sidebar Column -->
<div class="col-md-3" id="tg-sb-sidebar">
<ul id="mysidebar" class="nav">
<li class="sidebarTitle">PMD 7.8.0-SNAPSHOT</li>
<div class="sidebarTitleDate">Release date: 29-November-2024</div>
<li>
<a href="#">About</a>
<ul>
<li><a href="index.html">Home</a></li>
<li><a href="pmd_release_notes.html">Release notes</a></li>
<li><a href="pmd_release_notes_pmd7.html">Release notes (PMD 7)</a></li>
<li><a href="pmd_about_help.html">Getting help</a></li>
<li><a href="pmd_about_release_policies.html">Release policies</a></li>
<li><a href="pmd_about_support_lifecycle.html">Support lifecycle</a></li>
</ul>
</li>
<li>
<a href="#">User Documentation</a>
<ul>
<li><a href="pmd_userdocs_migrating_to_pmd7.html">Migration Guide for PMD 7</a></li>
<li><a href="pmd_userdocs_installation.html">Installation and basic CLI usage</a></li>
<li><a href="pmd_userdocs_making_rulesets.html">Making rulesets</a></li>
<li><a href="pmd_userdocs_configuring_rules.html">Configuring rules</a></li>
<li><a href="pmd_userdocs_best_practices.html">Best practices</a></li>
<li><a href="pmd_userdocs_suppressing_warnings.html">Suppressing warnings</a></li>
<li><a href="pmd_userdocs_incremental_analysis.html">Incremental analysis</a></li>
<li><a href="pmd_userdocs_cli_reference.html">PMD CLI reference</a></li>
<li><a href="pmd_userdocs_report_formats.html">PMD Report formats</a></li>
<li><a href="pmd_userdocs_3rdpartyrulesets.html">3rd party rulesets</a></li>
<li class="subfolders">
<a href="#">CPD reference</a>
<ul>
<li><a href="pmd_userdocs_cpd.html">Copy-paste detection</a></li>
<li><a href="pmd_userdocs_cpd_report_formats.html">CPD Report formats</a></li>
</ul>
</li>
<li class="subfolders">
<a href="#">Extending PMD</a>
<ul>
<li><a href="pmd_userdocs_extending_writing_rules_intro.html">Introduction to writing rules</a></li>
<li><a href="pmd_userdocs_extending_your_first_rule.html">Your first rule</a></li>
<li><a href="pmd_userdocs_extending_writing_xpath_rules.html">XPath rules</a></li>
<li><a href="pmd_userdocs_extending_writing_java_rules.html">Java rules</a></li>
<li><a href="pmd_userdocs_extending_designer_reference.html">Rule designer reference</a></li>
<li><a href="pmd_userdocs_extending_defining_properties.html">Defining rule properties</a></li>
<li><a href="pmd_userdocs_extending_rule_guidelines.html">Rule guidelines</a></li>
<li><a href="pmd_userdocs_extending_testing.html">Testing your rules</a></li>
<li><a href="pmd_userdocs_extending_ast_dump.html">Creating (XML) dump of the AST</a></li>
</ul>
</li>
<li class="subfolders">
<a href="#">Tools / Integrations</a>
<ul>
<li><a href="pmd_userdocs_tools_maven.html">Maven PMD Plugin</a></li>
<li><a href="pmd_userdocs_tools_gradle.html">Gradle</a></li>
<li class="active"><a href="pmd_userdocs_tools_ant.html">Ant</a></li>
<li><a href="pmd_userdocs_tools_java_api.html">PMD Java API</a></li>
<li><a href="pmd_userdocs_tools_bld.html">bld PMD Extension</a></li>
<li><a href="pmd_userdocs_tools_ci.html">CI integrations</a></li>
<li><a href="pmd_userdocs_tools.html">Other Tools / Integrations</a></li>
</ul>
</li>
</ul>
</li>
<li>
<a href="#">Rule Reference</a>
<ul>
<li class="subfolders">
<a href="#">Apex Rules</a>
<ul>
<li><a href="pmd_rules_apex.html">Index</a></li>
<li><a href="pmd_rules_apex_bestpractices.html">Best Practices</a></li>
<li><a href="pmd_rules_apex_codestyle.html">Code Style</a></li>
<li><a href="pmd_rules_apex_design.html">Design</a></li>
<li><a href="pmd_rules_apex_documentation.html">Documentation</a></li>
<li><a href="pmd_rules_apex_errorprone.html">Error Prone</a></li>
<li><a href="pmd_rules_apex_performance.html">Performance</a></li>
<li><a href="pmd_rules_apex_security.html">Security</a></li>
</ul>
</li>
<li class="subfolders">
<a href="#">HTML Rules</a>
<ul>
<li><a href="pmd_rules_html.html">Index</a></li>
<li><a href="pmd_rules_html_bestpractices.html">Best Practices</a></li>
</ul>
</li>
<li class="subfolders">
<a href="#">Java Rules</a>
<ul>
<li><a href="pmd_rules_java.html">Index</a></li>
<li><a href="pmd_rules_java_bestpractices.html">Best Practices</a></li>
<li><a href="pmd_rules_java_codestyle.html">Code Style</a></li>
<li><a href="pmd_rules_java_design.html">Design</a></li>
<li><a href="pmd_rules_java_documentation.html">Documentation</a></li>
<li><a href="pmd_rules_java_errorprone.html">Error Prone</a></li>
<li><a href="pmd_rules_java_multithreading.html">Multithreading</a></li>
<li><a href="pmd_rules_java_performance.html">Performance</a></li>
<li><a href="pmd_rules_java_security.html">Security</a></li>
</ul>
</li>
<li class="subfolders">
<a href="#">Java Server Pages Rules</a>
<ul>
<li><a href="pmd_rules_jsp.html">Index</a></li>
<li><a href="pmd_rules_jsp_bestpractices.html">Best Practices</a></li>
<li><a href="pmd_rules_jsp_codestyle.html">Code Style</a></li>
<li><a href="pmd_rules_jsp_design.html">Design</a></li>
<li><a href="pmd_rules_jsp_errorprone.html">Error Prone</a></li>
<li><a href="pmd_rules_jsp_security.html">Security</a></li>
</ul>
</li>
<li class="subfolders">
<a href="#">JavaScript Rules</a>
<ul>
<li><a href="pmd_rules_ecmascript.html">Index</a></li>
<li><a href="pmd_rules_ecmascript_bestpractices.html">Best Practices</a></li>
<li><a href="pmd_rules_ecmascript_codestyle.html">Code Style</a></li>
<li><a href="pmd_rules_ecmascript_errorprone.html">Error Prone</a></li>
<li><a href="pmd_rules_ecmascript_performance.html">Performance</a></li>
</ul>
</li>
<li class="subfolders">
<a href="#">Kotlin Rules</a>
<ul>
<li><a href="pmd_rules_kotlin.html">Index</a></li>
<li><a href="pmd_rules_kotlin_bestpractices.html">Best Practices</a></li>
<li><a href="pmd_rules_kotlin_errorprone.html">Error Prone</a></li>
</ul>
</li>
<li class="subfolders">
<a href="#">Maven POM Rules</a>
<ul>
<li><a href="pmd_rules_pom.html">Index</a></li>
<li><a href="pmd_rules_pom_errorprone.html">Error Prone</a></li>
</ul>
</li>
<li class="subfolders">
<a href="#">Modelica Rules</a>
<ul>
<li><a href="pmd_rules_modelica.html">Index</a></li>
<li><a href="pmd_rules_modelica_bestpractices.html">Best Practices</a></li>
</ul>
</li>
<li class="subfolders">
<a href="#">PLSQL Rules</a>
<ul>
<li><a href="pmd_rules_plsql.html">Index</a></li>
<li><a href="pmd_rules_plsql_bestpractices.html">Best Practices</a></li>
<li><a href="pmd_rules_plsql_codestyle.html">Code Style</a></li>
<li><a href="pmd_rules_plsql_design.html">Design</a></li>
<li><a href="pmd_rules_plsql_errorprone.html">Error Prone</a></li>
</ul>
</li>
<li class="subfolders">
<a href="#">Salesforce Visualforce Rules</a>
<ul>
<li><a href="pmd_rules_visualforce.html">Index</a></li>
<li><a href="pmd_rules_visualforce_security.html">Security</a></li>
</ul>
</li>
<li class="subfolders">
<a href="#">Scala Rules</a>
<ul>
<li><a href="pmd_rules_scala.html">Index</a></li>
</ul>
</li>
<li class="subfolders">
<a href="#">Swift Rules</a>
<ul>
<li><a href="pmd_rules_swift.html">Index</a></li>
<li><a href="pmd_rules_swift_bestpractices.html">Best Practices</a></li>
<li><a href="pmd_rules_swift_errorprone.html">Error Prone</a></li>
</ul>
</li>
<li class="subfolders">
<a href="#">Velocity Template Language (VTL) Rules</a>
<ul>
<li><a href="pmd_rules_velocity.html">Index</a></li>
<li><a href="pmd_rules_velocity_bestpractices.html">Best Practices</a></li>
<li><a href="pmd_rules_velocity_design.html">Design</a></li>
<li><a href="pmd_rules_velocity_errorprone.html">Error Prone</a></li>
</ul>
</li>
<li class="subfolders">
<a href="#">WSDL Rules</a>
<ul>
<li><a href="pmd_rules_wsdl.html">Index</a></li>
</ul>
</li>
<li class="subfolders">
<a href="#">XML Rules</a>
<ul>
<li><a href="pmd_rules_xml.html">Index</a></li>
<li><a href="pmd_rules_xml_bestpractices.html">Best Practices</a></li>
<li><a href="pmd_rules_xml_errorprone.html">Error Prone</a></li>
</ul>
</li>
<li class="subfolders">
<a href="#">XSL Rules</a>
<ul>
<li><a href="pmd_rules_xsl.html">Index</a></li>
<li><a href="pmd_rules_xsl_codestyle.html">Code Style</a></li>
<li><a href="pmd_rules_xsl_performance.html">Performance</a></li>
</ul>
</li>
</ul>
</li>
<li>
<a href="#">Language-Specific Documentation</a>
<ul>
<li><a href="pmd_languages_index.html">Overview</a></li>
<li><a href="pmd_languages_configuration.html">Language configuration</a></li>
<li><a href="pmd_languages_apex.html">Apex</a></li>
<li><a href="pmd_languages_cpp.html">C/C++</a></li>
<li><a href="pmd_languages_cs.html">C#</a></li>
<li><a href="pmd_languages_coco.html">Coco</a></li>
<li><a href="pmd_languages_dart.html">Dart</a></li>
<li><a href="pmd_languages_fortran.html">Fortran</a></li>
<li><a href="pmd_languages_gherkin.html">Gherkin</a></li>
<li><a href="pmd_languages_go.html">Go</a></li>
<li><a href="pmd_languages_html.html">HTML</a></li>
<li><a href="pmd_languages_java.html">Java</a></li>
<li><a href="pmd_languages_js_ts.html">JavaScript / TypeScript</a></li>
<li><a href="pmd_languages_jsp.html">JSP</a></li>
<li><a href="pmd_languages_julia.html">Julia</a></li>
<li><a href="pmd_languages_kotlin.html">Kotlin</a></li>
<li><a href="pmd_languages_lua.html">Lua</a></li>
<li><a href="pmd_languages_matlab.html">Matlab</a></li>
<li><a href="pmd_languages_modelica.html">Modelica</a></li>
<li><a href="pmd_languages_objectivec.html">Objective-C</a></li>
<li><a href="pmd_languages_perl.html">Perl</a></li>
<li><a href="pmd_languages_php.html">PHP</a></li>
<li><a href="pmd_languages_plsql.html">PLSQL</a></li>
<li><a href="pmd_languages_python.html">Python</a></li>
<li><a href="pmd_languages_ruby.html">Ruby</a></li>
<li><a href="pmd_languages_scala.html">Scala</a></li>
<li><a href="pmd_languages_swift.html">Swift</a></li>
<li><a href="pmd_languages_tsql.html">T-SQL</a></li>
<li><a href="pmd_languages_visualforce.html">Visualforce</a></li>
<li><a href="pmd_languages_velocity.html">Velocity Template Language (VTL)</a></li>
<li><a href="pmd_languages_xml.html">XML and XML dialects</a></li>
</ul>
</li>
<li>
<a href="#">Developer Documentation</a>
<ul>
<li><a href="pmd_devdocs_development.html">Developer resources</a></li>
<li><a href="pmd_devdocs_building.html">Building PMD from source</a></li>
<li><a href="https://github.com/pmd/pmd/blob/main/CONTRIBUTING.md" target="_blank">Contributing</a></li>
<li><a href="pmd_devdocs_writing_documentation.html">Writing documentation</a></li>
<li><a href="pmd_devdocs_roadmap.html">Roadmap</a></li>
<li><a href="pmd_devdocs_how_pmd_works.html">How PMD works</a></li>
<li><a href="pmd_devdocs_pmdtester.html">Pmdtester</a></li>
<li><a href="pmd_devdocs_rule_deprecation_policy.html">Rule Deprecation Policy</a></li>
<li class="subfolders">
<a href="#">Major contributions</a>
<ul>
<li><a href="pmd_devdocs_major_rule_guidelines.html">Rule Guidelines</a></li>
<li><a href="pmd_devdocs_major_adding_new_language_javacc.html">Adding a new language (JavaCC)</a></li>
<li><a href="pmd_devdocs_major_adding_new_language_antlr.html">Adding a new language (ANTLR)</a></li>
<li><a href="pmd_devdocs_major_adding_new_cpd_language.html">Adding a new CPD language</a></li>
</ul>
</li>
<li class="subfolders">
<a href="#">Experimental features</a>
<ul>
<li><a href="tag_experimental.html">List of experimental Features</a></li>
</ul>
</li>
</ul>
</li>
<li>
<a href="#">Project documentation</a>
<ul>
<li class="subfolders">
<a href="#">Trivia about PMD</a>
<ul>
<li><a href="pmd_projectdocs_trivia_news.html">PMD in the press</a></li>
<li><a href="pmd_projectdocs_trivia_products.html">Products & books related to PMD</a></li>
<li><a href="pmd_projectdocs_trivia_similarprojects.html">Similar projects</a></li>
<li><a href="pmd_projectdocs_trivia_meaning.html">What does 'PMD' mean?</a></li>
</ul>
</li>
<li><a href="pmd_projectdocs_logo.html">Logo</a></li>
<li><a href="pmd_projectdocs_faq.html">FAQ</a></li>
<li><a href="license.html">License</a></li>
<li><a href="pmd_projectdocs_credits.html">Credits</a></li>
<li><a href="pmd_release_notes_old.html">Old release notes</a></li>
<li><a href="pmd_projectdocs_decisions.html">Decisions</a></li>
<li class="subfolders">
<a href="#">Project management</a>
<ul>
<li><a href="pmd_projectdocs_committers_infrastructure.html">Infrastructure</a></li>
<li><a href="pmd_projectdocs_committers_releasing.html">Release process</a></li>
<li><a href="pmd_projectdocs_committers_merging_pull_requests.html">Merging pull requests</a></li>
<li><a href="pmd_projectdocs_committers_main_landing_page.html">Main Landing page</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
<!-- Content Column -->
<div class="col-md-9" id="tg-sb-content">
<header>
<div class="row">
<div class="col-lg-12">
<a href="./" role="button"
><i class="fa fa-home fa-lg"></i
></a>
» Ant Task Usage
<a
target="_blank"
href="https://github.com/pmd/pmd/blob/main/docs/pages/pmd/userdocs/tools/ant.md"
class="float-right"
role="button"
><i class="fab fa-github fa-lg"></i> Edit on GitHub</a
>
</div>
</div>
<hr />
</header>
<div class="post-header">
<h1 class="post-title-main">Ant Task Usage</h1>
</div>
<div class="post-content" data-github-edit-url="https://github.com/pmd/pmd/blob/main/docs/pages/pmd/userdocs/tools/ant.md">
<details id="inline-toc-details">
<summary>Table of Contents</summary>
<div id="inline-toc"><!-- empty, move TOC here when screen size too small --></div>
</details>
<h2 id="pmd">PMD</h2>
<h3 id="description">Description</h3>
<p>Runs a set of static code analysis rules on some source code files and generates a list of problems found.</p>
<h3 id="installation">Installation</h3>
<p>Before you can use the <code class="language-plaintext highlighter-rouge">pmd</code> task in your ant <code class="language-plaintext highlighter-rouge">build.xml</code> file, you need to install PMD and its libraries into
ants classpath, as described in <a href="https://ant.apache.org/manual/install.html#optionalTasks">Optional Tasks</a>.</p>
<p>First you need to download PMDs binary distribution zip file.
Then you can either copy all “*.jar” files from PMDs lib folder into one of ANTs library folders
(<code class="language-plaintext highlighter-rouge">ANT_HOME/lib</code>, <code class="language-plaintext highlighter-rouge">${user.home}/.ant/lib</code>) or using the <code class="language-plaintext highlighter-rouge">-lib</code> command line parameter.</p>
<p>However, the preferred way is to define a <code class="language-plaintext highlighter-rouge">&lt;classpath&gt;</code> for pmd itself and use this classpath when
adding the PMD Task. Assuming, you have extracted the PMD zip file to <code class="language-plaintext highlighter-rouge">/home/joe/pmd-bin-7.8.0-SNAPSHOT</code>,
then you can make use of the PMD Task like this:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&lt;taskdef name="pmd" classname="net.sourceforge.pmd.ant.PMDTask"&gt;
&lt;classpath&gt;
&lt;fileset dir="/home/joe/pmd-bin-7.8.0-SNAPSHOT/lib"&gt;
&lt;include name="*.jar"/&gt;
&lt;/fileset&gt;
&lt;/classpath&gt;
&lt;/taskdef&gt;
</code></pre></div></div>
<p>Alternatively, a path can be defined and used via <code class="language-plaintext highlighter-rouge">classpathref</code>:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&lt;path id="pmd.classpath"&gt;
&lt;fileset dir="/home/joe/pmd-bin-7.8.0-SNAPSHOT/lib"&gt;
&lt;include name="*.jar"/&gt;
&lt;/fileset&gt;
&lt;/path&gt;
&lt;taskdef name="pmd" classname="net.sourceforge.pmd.ant.PMDTask" classpathref="pmd.classpath" /&gt;
</code></pre></div></div>
<p>The examples below wont repeat this taskdef element, as this is always required.</p>
<h3 id="parameters">Parameters</h3>
<table>
<tr>
<th>Attribute</th>
<th>Description</th>
<th>Required</th>
</tr>
<tr>
<td>rulesetfiles</td>
<td>
A comma delimited list of ruleset files ('rulesets/java/quickstart.xml,config/my-ruleset.xml').
If you write your own ruleset files, you can put them on the classpath and plug them in here.
</td>
<td>Yes, unless the ruleset nested element is used</td>
</tr>
<tr>
<td>failOnError</td>
<td>Whether or not to fail the build if any recoverable errors occurred while analyzing files.</td>
<td>No</td>
</tr>
<tr>
<td>failOnRuleViolation</td>
<td>Whether or not to fail the build if PMD finds any problems</td>
<td>No</td>
</tr>
<tr>
<td>minimumPriority</td>
<td>The rule priority threshold; rules with lower priority than they will not be used</td>
<td>No</td>
</tr>
<tr>
<td>failuresPropertyName</td>
<td>A property name to plug the number of rule violations into when the task finishes</td>
<td>No</td>
</tr>
<tr>
<td>encoding</td>
<td>The character set encoding (e.g. UTF-8) to use when reading the source code files</td>
<td>No</td>
</tr>
<tr>
<td>suppressMarker</td>
<td>The series of characters to use to tell PMD to skip lines - the default is NOPMD.</td>
<td>No</td>
</tr>
<tr>
<td>maxRuleViolations</td>
<td>
Whether or not to fail the build if PMD finds more than the value of this attribute.
Note that setting this attribute does not require to set the failOnRuleViolation to true.
</td>
<td>No</td>
</tr>
<tr>
<td>cacheLocation</td>
<td>
The location of the analysis cache file to be used.
Setting this property enables Incremental Analysis, which can greatly improve analysis time without loosing analysis quality.
<b>Its use is strongly recommended.</b>
</td>
<td>No</td>
</tr>
<tr>
<td>noCache</td>
<td>
Setting this property to true disables Incremental Analysis, even if <i>cacheLocation</i> is provided.
You can use this to explicitly turn off suggestions to use incremental analysis, or for testing purposes.
</td>
<td>No</td>
</tr>
<tr>
<td>threads</td>
<td>
Sets the number of threads used by PMD. Set threads to <code>0</code> to disable multi-threading processing.
Default: 1
</td>
<td>No</td>
</tr>
</table>
<p><code class="language-plaintext highlighter-rouge">formatter</code> nested element - specifies the format of and the files to which the report is written. You can
configure multiple formatters.</p>
<table>
<tr><th>Name</th><th>Values</th></tr>
<tr>
<td>type</td>
<td>xml,ideaj,textcolor,text,textpad,emacs,csv,html,xslt,yahtml,summaryhtml,vbhtml,codeclimate</td>
</tr>
<tr>
<td>showSuppressed</td>
<td>Whether to show suppressed warnings; "false" is the default.</td>
</tr>
<tr>
<td>toFile</td>
<td>A filename to which to write the report</td>
</tr>
<tr>
<td>toConsole</td>
<td>Whether to output the report to the console; "false" is the default.</td>
</tr>
<tr>
<td colspan="2">
<p>The <code>formatter</code> element can contain nested <code>param</code> elements to configure the formatter in detail, e.g.</p>
<dl>
<dt>encoding</dt>
<dd>Specifies the encoding to be used in the generated report (only honored when used with `toFile`). When rendering `toConsole` PMD will automatically detect the terminal's encoding and use it, unless the output is being redirected / piped, in which case `file.encoding` is used. See example below.</dd>
<dt>linkPrefix</dt>
<dd>Used for linking to online HTMLized source (like <a href="https://maven.apache.org/plugins/maven-pmd-plugin/xref/org/apache/maven/plugins/pmd/PmdReport.html">this</a>). See example below. Note, this only works with
<a href="https://maven.apache.org/jxr/maven-jxr-plugin/index.html">maven-jxr-plugin</a>.</dd>
<dt>linePrefix</dt>
<dd>Used for linking to online HTMLized source (like <a href="https://maven.apache.org/plugins/maven-pmd-plugin/xref/org/apache/maven/plugins/pmd/PmdReport.html#L375">this</a>). See example below. Note, this only works with <a href="https://maven.apache.org/jxr/maven-jxr-plugin/index.html">maven-jxr-plugin</a>.</dd>
</dl>
</td>
</tr>
</table>
<p><code class="language-plaintext highlighter-rouge">classpath</code> nested element - useful for specifying custom rules. More details on the <code class="language-plaintext highlighter-rouge">classpath</code>
element are in the Ant documentation for <a href="https://ant.apache.org/manual/using.html#path">path-like structures</a> and theres
an example below.</p>
<p><code class="language-plaintext highlighter-rouge">auxclasspath</code> nested element - extra classpath used for type resolution. Some rules make use of type resolution
in order to avoid false positives. The <code class="language-plaintext highlighter-rouge">auxclasspath</code> is configured also with <a href="https://ant.apache.org/manual/using.html#path">path-like structures</a>. It should contain the compiled classes of the project that is being analyzed and all the compile time
dependencies.</p>
<p><code class="language-plaintext highlighter-rouge">sourceLanguage</code> nested element - specify which language (Java, Ecmascript, XML,…)
and the associated version (1.5, 1.6,…). This element is optional. The language is determined by file extension
automatically and the latest language version is used.</p>
<p><code class="language-plaintext highlighter-rouge">ruleset</code> nested element - another way to specify rulesets. You can specify multiple elements. Heres an example:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&lt;target name="pmd"&gt;
&lt;pmd&gt;
&lt;ruleset&gt;rulesets/java/quickstart.xml&lt;/ruleset&gt;
&lt;ruleset&gt;config/my-ruleset.xml&lt;/ruleset&gt;
&lt;fileset dir="/usr/local/j2sdk1.4.1_01/src/"&gt;
&lt;include name="java/lang/*.java"/&gt;
&lt;/fileset&gt;
&lt;/pmd&gt;
&lt;/target&gt;
</code></pre></div></div>
<p><code class="language-plaintext highlighter-rouge">fileset</code> nested element - specify the actual java source files, that PMD should analyze. You can use multiple
fileset elements. See <a href="https://ant.apache.org/manual/Types/fileset.html">FileSet</a> for the syntax and usage.</p>
<p><code class="language-plaintext highlighter-rouge">relativizePathsWith</code> nested element - configures the paths relative to which directories are rendered in the report.
This option allows shortening directories in the report; without it, paths are rendered as absolute paths.
The option can be repeated, in which case the shortest relative path will be used.
It is a <a href="https://ant.apache.org/manual/using.html#path">path-like structure</a>.</p>
<h3 id="language-version-selection">Language version selection</h3>
<p>PMD selects the language automatically using the file extension. If multiple versions of a language are
supported, PMD uses the latest version as default. This is currently the case for Java only, which has
support for multiple versions.</p>
<p>If a languages supports multiple versions, you can select a specific version here, so that e.g. rules, that only apply
to specific versions, are not executed. E.g. the rule <a href="pmd_rules_java_bestpractices.html#usetrywithresources"><code class="language-plaintext highlighter-rouge">UseTryWithResources</code></a> only makes
sense with Java 1.7 and later. If your project uses Java 1.5, then you should configure the <code class="language-plaintext highlighter-rouge">sourceLanguage</code>
accordingly and this rule wont be executed.</p>
<p>The specific version of a language to be used is selected via the <code class="language-plaintext highlighter-rouge">sourceLanguage</code>
nested element. Example:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&lt;sourceLanguage name="java" version="23"/&gt;
</code></pre></div></div>
<p>The available versions depend on the language. You can get a list of the currently supported language versions
via the CLI option <code class="language-plaintext highlighter-rouge">--help</code>.</p>
<h3 id="postprocessing-the-report-file-with-xslt">Postprocessing the report file with XSLT</h3>
<p>Several folks (most recently, Wouter Zelle) have written XSLT scripts
which you can use to transform the XML report into nifty HTML. To do this,
make sure you use the XML formatter in the PMD task invocation, i.e.:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&lt;formatter type="xml" toFile="${tempbuild}/report_pmd.xml"&gt;
&lt;param name="encoding" value="UTF-8" /&gt; &lt;!-- enforce UTF-8 encoding for the XML --&gt;
&lt;/formatter&gt;
</code></pre></div></div>
<p>Then, after the end of the PMD task, do this:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&lt;xslt in="${tempbuild}/report_pmd.xml" style="${pmdConfig}/wz-pmd-report.xslt" out="${pmdOutput}/report_pmd.html" /&gt;
</code></pre></div></div>
<h3 id="examples">Examples</h3>
<h4 id="one-ruleset">One ruleset</h4>
<p>Running one ruleset to produce a HTML report (and printing the report to the console as well) using a file cache</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&lt;target name="pmd"&gt;
&lt;pmd rulesetfiles="rulesets/java/quickstart.xml" cacheLocation="build/pmd/pmd.cache"&gt;
&lt;formatter type="html" toFile="pmd_report.html" toConsole="true"/&gt;
&lt;fileset dir="C:\j2sdk1.4.1_01\src\java\lang\"&gt;
&lt;include name="**/*.java"/&gt;
&lt;/fileset&gt;
&lt;/pmd&gt;
&lt;/target&gt;
</code></pre></div></div>
<h4 id="multiple-rulesets">Multiple rulesets</h4>
<p>Running multiple rulesets to produce an XML report with the same analysis cache</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&lt;target name="pmd"&gt;
&lt;pmd rulesetfiles="rulesets/java/quickstart.xml,config/my-ruleset.xml" cacheLocation="build/pmd/pmd.cache"&gt;
&lt;formatter type="xml" toFile="c:\pmd_report.xml"/&gt;
&lt;fileset dir="C:\j2sdk1.4.1_01\src\java\lang\"&gt;
&lt;include name="**/*.java"/&gt;
&lt;/fileset&gt;
&lt;/pmd&gt;
&lt;/target&gt;
</code></pre></div></div>
<h4 id="custom-renderer">Custom renderer</h4>
<p>Using a custom renderer. For this to work, you need to add you custom renderer to the classpath of PMD. This
need to be configured when defining the task:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&lt;path id="pmd.classpath"&gt;
&lt;fileset dir="/home/joe/pmd-bin-7.8.0-SNAPSHOT/lib"&gt;
&lt;include name="*.jar"/&gt;
&lt;/fileset&gt;
&lt;!-- the custom renderer is expected to be in /home/joe/pmd-addons/com/company/MyRenderer.class --&gt;
&lt;pathelement location="/home/joe/pmd-addons" /&gt;
&lt;/path&gt;
&lt;taskdef name="pmd" classname="net.sourceforge.pmd.ant.PMDTask" classpathref="pmd.classpath" /&gt;
&lt;target name="pmd"&gt;
&lt;pmd rulesetfiles="rulesets/java/quickstart.xml"&gt;
&lt;formatter type="com.mycompany.MyRenderer" toFile="foo.html"/&gt;
&lt;fileset dir="/path/to/java/src"&gt;
&lt;include name="**/*.java"/&gt;
&lt;/fileset&gt;
&lt;/pmd&gt;
&lt;/target&gt;
</code></pre></div></div>
<h4 id="full-example-with-auxclasspath">Full example with auxclasspath</h4>
<p>Full build file example using the correct auxclasspath configuration.
Your project needs to be compiled first which happens in the target “compile”:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&lt;project name="MyProject" default="pmd" basedir="."&gt;
&lt;property name="src" location="src"/&gt;
&lt;property name="build" location="build"/&gt;
&lt;path id="project.dependencies"&gt;
&lt;pathelement location="lib/third-party.jar"/&gt;
&lt;pathelement location="lib/xyz.jar"/&gt;
&lt;/path&gt;
&lt;path id="pmd.classpath"&gt;
&lt;fileset dir="/home/joe/pmd-bin-7.8.0-SNAPSHOT/lib"&gt;
&lt;include name="*.jar"/&gt;
&lt;/fileset&gt;
&lt;/path&gt;
&lt;taskdef name="pmd" classname="net.sourceforge.pmd.ant.PMDTask" classpathref="pmd.classpath" /&gt;
&lt;target name="init"&gt;
&lt;mkdir dir="${build}"/&gt;
&lt;/target&gt;
&lt;target name="compile" depends="init"&gt;
&lt;javac srcdir="${src}" destdir="${build}" classpathref="project.dependencies"
source="1.8" target="1.8" /&gt;
&lt;/target&gt;
&lt;target name="pmd" depends="compile"&gt;
&lt;pmd cacheLocation="${build}/pmd.cache"&gt;
&lt;auxclasspath&gt;
&lt;pathelement location="${build}"/&gt;
&lt;path refid="project.dependencies"/&gt;
&lt;/auxclasspath&gt;
&lt;ruleset&gt;rulesets/java/quickstart.xml&lt;/ruleset&gt;
&lt;formatter type="html" toFile="${build}/pmd_report.html"/&gt;
&lt;sourceLanguage name="java" version="1.8"/&gt;
&lt;fileset dir="${src}"&gt;
&lt;include name="**/*.java"/&gt;
&lt;/fileset&gt;
&lt;/pmd&gt;
&lt;/target&gt;
&lt;target name="clean"&gt;
&lt;delete dir="${build}"/&gt;
&lt;/target&gt;
&lt;/project&gt;
</code></pre></div></div>
<p>You can run pmd then with <code class="language-plaintext highlighter-rouge">ant pmd</code>.</p>
<h4 id="getting-verbose-output">Getting verbose output</h4>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[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/java/quickstart.xml
[pmd] Using rule AvoidMessageDigestField
[pmd] Using rule AvoidStringBufferField
[pmd] Using rule AvoidUsingHardCodedIP
[pmd] Using rule CheckResultSet
[pmd] Using rule ConstantsInInterface
...
[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]$
</code></pre></div></div>
<h4 id="html-report-with-linkprefix">HTML report with linkPrefix</h4>
<p>An HTML report with the “linkPrefix” and “linePrefix” properties:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&lt;target name="pmd"&gt;
&lt;pmd rulesetfiles="rulesets/java/quickstart.xml"&gt;
&lt;formatter type="html" toFile="pmd_report.html"&gt;
&lt;param name="linkPrefix" value="https://maven.apache.org/plugins/maven-pmd-plugin/xref/"/&gt;
&lt;param name="linePrefix" value="L"/&gt;
&lt;/formatter&gt;
&lt;fileset dir="/usr/local/j2sdk1.4.1_01/src/"&gt;
&lt;include name="java/lang/*.java"/&gt;
&lt;/fileset&gt;
&lt;relativizePathsWith&gt;
&lt;pathelement location="/usr/local/j2sdk1.4.1_01/src/"/&gt;
&lt;/relativizePathsWith&gt;
&lt;/pmd&gt;
&lt;/target&gt;
</code></pre></div></div>
<h3 id="memory-usage">Memory Usage</h3>
<p>Memory usage has been reduced significantly starting with the PMD 4.0 release.
When testing all Java rules on the jdk 1.6 source code (about 7000 classes),
the allocated heap space does not go over 60M.</p>
<p>However, on very large projects, the Ant task may still fail with a OutOfMemoryError.
To prevent this from happening, increase the maximum memory usable by ant using the ANT_OPTS variable
(adjust the size according to your available memory):</p>
<p>On Windows:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>set ANT_OPTS=-Xmx1024m -Xms512m
</code></pre></div></div>
<p>On Linux</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>export ANT_OPTS="-Xmx1024m -Xms512m"
</code></pre></div></div>
<div class="tags">
<b>Tags: </b>
<a href="tag_userdocs.html" class="btn btn-outline-secondary navbar-btn cursorNorm" role="button">userdocs</a>
<a href="tag_tools.html" class="btn btn-outline-secondary navbar-btn cursorNorm" role="button">tools</a>
</div>
</div>
<footer>
<hr />
<div>
This documentation is written in markdown. <br />
If there is something missing or can be improved, edit this page on
github and create a PR:
<a
target="_blank"
href="https://github.com/pmd/pmd/blob/main/docs/pages/pmd/userdocs/tools/ant.md"
role="button"
><i class="fab fa-github fa-lg"></i> Edit on GitHub</a
>
</div>
<hr />
<div class="row">
<div class="col-lg-12 footer">
&copy;2024 PMD Open Source Project. All rights
reserved. <br />
<span>Page last updated:</span>
June 2024 (7.3.0)<br /> Site last generated: Nov 21, 2024 <br />
<p>
<img src="images/logo/pmd-logo-70px.png" alt="PMD
logo"/>
</p>
</div>
</div>
</footer>
</div>
<!-- /.row -->
</div>
<!-- /.container -->
</div>
<!-- Sticky TOC column -->
<div class="toc-col">
<div id="toc"></div>
</div>
<!-- /.toc-container-wrapper -->
</div>
</div>
<script type="application/javascript" src="assets/jquery-3.5.1/jquery-3.5.1.min.js"></script>
<script type="application/javascript" src="assets/anchorjs-4.2.2/anchor.min.js"></script>
<script type="application/javascript" src="assets/navgoco-0.2.1/src/jquery.navgoco.min.js"></script>
<script type="application/javascript" src="assets/bootstrap-4.5.2-dist/js/bootstrap.bundle.min.js"></script>
<script type="application/javascript" src="assets/Simple-Jekyll-Search-1.0.8/dest/jekyll-search.js"></script>
<script type="application/javascript" src="assets/jekyll-table-of-contents/toc.js"></script>
<script type="application/javascript" src="js/tabstate.js"></script>
<script type="application/javascript" src="js/customscripts.js"></script>
</body>
</html>