 ------
 Introduction
 ------
 Maria Odea Ching
 ------
 2015-05-01
 ------

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

~~ NOTE: For help with the syntax of this file, see:
~~ http://maven.apache.org/doxia/references/apt-format.html


${project.name}

  The Checkstyle Plugin generates a report regarding the code style used by the developers. For more information about Checkstyle,
  see {{{https://checkstyle.org/}https://checkstyle.org/}}.

  This version of the plugin uses Checkstyle ${checkstyleVersion} by default and requires Java ${javaVersion}. But you can
  {{{./examples/upgrading-checkstyle.html}upgrade the version used at runtime}}.

  The plugin can be configured in the project's POM. Predefined rulesets available for use in this version of the plugin are:
  {{{http://checkstyle.sourceforge.net/sun_style.html}<<<sun_checks.xml>>>}} and
  {{{http://checkstyle.sourceforge.net/google_style.html}<<<google_checks.xml>>>}}.
  You can also use a custom ruleset by specifying it in the plugin configuration.

* Goals Overview

   The Checkstyle Plugin has three goals:

   * {{{./checkstyle-mojo.html}checkstyle:checkstyle}} is a reporting goal that performs Checkstyle analysis and generates a report on violations.

   * {{{./checkstyle-aggregate-mojo.html}checkstyle:checkstyle-aggregate}} is a reporting goal that performs Checkstyle analysis and generates an aggregate HTML report on violations in a multi-module reactor build.

   * {{{./check-mojo.html}checkstyle:check}} is a goal that performs Checkstyle analysis and outputs violations or a count of violations to the console, potentially failing the build. It can also be configured to re-use an earlier analysis.

* Major Version Upgrade to version 3.0.0

  Please note that the following parameters have been completely removed from the plugin configuration:

   * <<<sourceDirectory>>>: use <<<sourceDirectories>>> instead;

   * <<<testSourceDirectory>>>: use <<<testSourceDirectories>>> instead.

* Usage

  General instructions on how to use the Checkstyle 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 fill 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}}.

* Examples

   The following examples show how to use the Checkstyle Plugin in more advanced usecases:

   * {{{./examples/upgrading-checkstyle.html}Upgrading Checkstyle at Runtime}}

   * {{{./examples/inline-checker-config.html}Using an 'Inline' Checkstyle Checker Configuration}}

   * {{{./examples/custom-checker-config.html}Using a Custom Checkstyle Checker Configuration}}

   * {{{./examples/custom-property-expansion.html}Using Custom Checkstyle Property Expansion Definitions}}

   * {{{./examples/suppressions-filter.html}Using a Suppressions Filter}}

   * {{{./examples/custom-developed-checkstyle.html}Using Custom Developed Checkstyle Check Modules}}

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

  []
