 ------
 Introduction
 ------
 Dennis Lundberg
 ------
 2014-07-28
 ------

 ~~ Licensed to the Apache Software Foundation (ASF) under one
 ~~ or more contributor license agreements.  See the NOTICE file
 ~~ distributed with this work for additional information
 ~~ regarding copyright ownership.  The ASF licenses this file
 ~~ to you under the Apache License, Version 2.0 (the
 ~~ "License"); you may not use this file except in compliance
 ~~ with the License.  You may obtain a copy of the License at
 ~~
 ~~   http://www.apache.org/licenses/LICENSE-2.0
 ~~
 ~~ Unless required by applicable law or agreed to in writing,
 ~~ software distributed under the License is distributed on an
 ~~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 ~~ KIND, either express or implied.  See the License for the
 ~~ specific language governing permissions and limitations
 ~~ under the License.

${project.name}

  The PMD Plugin allows you to automatically run the {{{http://pmd.sourceforge.net/}PMD}} code analysis tool
  on your project's source code and generate a site report with its results. It also supports the separate
  Copy/Paste Detector tool (or CPD) distributed with PMD.

  This version of Maven PMD Plugin uses PMD ${pmdVersion} and requires Java ${javaVersion}.

  The plugin accepts configuration parameters that can be used to customize the execution of the PMD tool.


* Goals Overview

  This plugin has 4 goals:

  * {{{./pmd-mojo.html}pmd:pmd}} creates a PMD site report based on the rulesets and configuration set in the plugin.
    It can also generate a pmd output file aside from the site report in any of the following formats: xml, csv or txt.

  * {{{./cpd-mojo.html}pmd:cpd}} generates a report for PMD's Copy/Paste Detector (CPD) tool.  It can also
    generate a cpd results file in any of these formats: xml, csv or txt.

  * {{{./check-mojo.html}pmd:check}} verifies that the PMD report is empty and fails the build if it is not. This goal is executed by
    default when <<<pmd:pmd>>> is executed.

  * {{{./cpd-check-mojo.html}pmd:cpd-check}} verifies that the CPD report is empty and fails the build if it is not. This goal is
    executed by default when <<<pmd:cpd>>> is executed.

* Usage

  General instructions on how to use the PMD Plugin can be found on the {{{./usage.html}usage page}}. Some more
  specific use cases are described in the examples given below. Last but not least, users occasionally contribute
  additional examples, tips or errata to the
  {{{http://docs.codehaus.org/display/MAVENUSER/PMD+Plugin}plugin's wiki page}}.

  In case you still have questions regarding the plugin's usage, please have a look at the {{{./faq.html}FAQ}} and feel
  free to contact the {{{./mail-lists.html}user mailing list}}. The posts to the mailing list are archived and could
  already contain the answer to your question as part of an older thread. Hence, it is also worth browsing/searching
  the {{{./mail-lists.html}mail archive}}.

  If you feel like the plugin is missing a feature or has a defect, you can fill a feature request or bug report in our
  {{{./issue-tracking.html}issue tracker}}. When creating a new issue, please provide a comprehensive description of your
  concern. Especially for fixing bugs it is crucial that the developers can reproduce your problem. For this reason,
  entire debug logs, POMs or most preferably little demo projects attached to the issue are very much appreciated.
  Of course, patches are welcome, too. Contributors can check out the project from our
  {{{./source-repository.html}source repository}} and will find supplementary information in the
  {{{http://maven.apache.org/guides/development/guide-helping.html}guide to helping with Maven}}.

* Examples

  To provide you with better understanding of some usages of the Maven PMD Plugin, you can take a look into the
  following examples:

  * {{{./examples/removeReport.html}Remove Report}}

  * {{{./examples/targetJdk.html}Target JDK}}

  * {{{./examples/usingRuleSets.html}Using Rule Sets}}

  * {{{./examples/violationChecking.html}Violation Checking}}

  * {{{./examples/javascriptReport.html}Analyzing JavaScript Code}}

  * {{{./examples/jspReport.html}Analyzing Java Server Pages Code}}

  []
