 ------
 Introduction
 ------
 Dennis Lundberg
 ------
 2017-11-11
 ------

 ~~ 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 {{{https://pmd.github.io/}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.

  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}}.

* Upgrading Notes

  <<Note:>> Starting with PMD 6.0.0 and Maven PMD Plugin 3.9.0, the rules have been reorganized
  into categories, e.g. <<</category/java/bestpractices.xml>>>. So when upgrading to
  Maven PMD Plugin 3.9.0 you should review your plugin configuration and/or custom ruleset.
  See {{{./examples/usingRuleSets.html}Using Rule Sets}} for more information.


* 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/upgrading-PMD-at-runtime.html}Upgrading PMD at Runtime}}

  * {{{./examples/multi-module-config.html}Multimodule Configuration}}

  * {{{./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}}

  []
