 ------
 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}.
  See {{{./examples/upgrading-PMD-at-runtime.html}Upgrading PMD at Runtime}} for more information.

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


* Goals Overview

  This plugin has the following 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.

  * {{{./aggregate-pmd-mojo.html}pmd:aggregate-pmd}} creates a PMD site report in an <<aggregator>> project
    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.

  * {{{./aggregate-pmd-no-fork-mojo.html}pmd:aggregate-pmd-no-fork}} creates a PMD site report in an <<aggregator>>
    project without forking the <<<test-compile>>> phase again.

  * {{{./cpd-mojo.html}pmd:cpd}} creates 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.

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

  * {{{./check-mojo.html}pmd:check}} fails the build if there were any PMD violations in the source code.
    This goal invokes automatically <<<pmd:pmd>>> prior to executing itself.

  * {{{./aggregate-pmd-check-mojo.html}pmd:aggregate-pmd-check}} fails the build in an <<aggregator>> project if there
    were any PMD violations in the source code.
    This goal invokes automatically <<<pmd:aggregate-pmd>>> prior to executing itself.

  * {{{./cpd-check-mojo.html}pmd:cpd-check}} fails the build if there were any CPD violations in the source code.
    This goal invokes automatically <<<pmd:cpd>>> prior to executing itself.

  * {{{./aggregate-cpd-check-mojo.html}pmd:aggregate-cpd-check}} fails the build in an <<aggregator>> project
    if there were any CPD violations in the source code.
    This goal invokes automatically <<<pmd:aggregate-cpd>>> prior to executing itself.

* 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 {{{./mailing-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 {{{./mailing-lists.html}mail archive}}.

  If you feel like the plugin is missing a feature or has a defect, you can file a feature request or bug report in our
  {{{./issue-management.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
  {{{./scm.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

** 3.22.0

    * Starting with Maven PMD Plugin 3.22.0, the plugin requires PMD version 7.0.0 or higher.
      PMD 7.0.0 switched to SLF4J and since Maven 3.1.0+ SLF4J is the default logging API.
      Logs from PMD are now always shown and cannot be disabled at runtime after maven has started.
      The property <<<showPmdLog>>> makes no sense anymore and is deprecated now. See
      {{{https://maven.apache.org/maven-logging.html}Maven Logging}} for how to configure logging.
      For disabling PMD logs, you'd need to start maven with <<<MAVEN_OPTS=-Dorg.slf4j.simpleLogger.log.net.sourceforge.pmd=off mvn <goals> >>>.

    * The upgrade from PMD 6 to PMD 7.0.0 is a major version change. If you use the default ruleset
      from Maven PMD Plugin, then everything should just work. But if you use a custom ruleset, you
      most likely need to review your ruleset and migrate it to PMD 7. Rules might have been renamed or
      replaced. See {{{https://docs.pmd-code.org/latest/pmd_release_notes_pmd7.html}Detailed Release Notes for PMD 7}}
      and {{{https://docs.pmd-code.org/latest/pmd_userdocs_migrating_to_pmd7.html}Migration Guide for PMD 7}}.

    * If you currently override the dependency to PMD ({{{./examples/upgrading-PMD-at-runtime.html}Upgrading PMD at Runtime}})
      make sure to upgrade PMD as well to 7.0.0 or later when upgrading the Maven PMD Plugin.

** 3.9.0

    * 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/aggregate.html}Aggregating PMD reports for Multi-Module-Projects}}

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

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

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

  * {{{./examples/cpdCsharp.html}Finding duplicated code in C#}}

  * {{{./examples/differentRulesetForTests.html}Different ruleset for tests}}

  []
