 ------
 Introduction
 ------
 Johnny R. Ruiz III
 <jruiz@exist.com>
 ------
 2013-07-22
 ------

~~ 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 Maven Project Info Reports plugin is used to generate reports information about the project.

* Goals Overview

 The Project Info Reports Plugin has the following goals:

   * {{{./ci-management-mojo.html}project-info-reports:ci-management}} is used to generate the Project Continuous Integration
   Management report.

   * {{{./dependencies-mojo.html}project-info-reports:dependencies}} is used to generate the Project Dependencies
   report.

   * {{{./dependency-convergence-mojo.html}project-info-reports:dependency-convergence}} is used to generate the
   Project Dependency Convergence report for (reactor) builds.

   * {{{./dependency-info-mojo.html}project-info-reports:dependency-info}} is used to generate code snippets to
   be added to build tools.

   * {{{./dependency-management-mojo.html}project-info-reports:dependency-management}} is used to generate the
   Project Dependency Management report.

   * {{{./distribution-management-mojo.html}project-info-reports:distribution-management}} is used to generate
   the Project Distribution Management report.

   * {{{./help-mojo.html}project-info-reports:help}} is used to display help information
   on the Project Info Reports Plugin.

   * {{{./index-mojo.html}project-info-reports:index}} is used to generate the Project index page.

   * {{{./issue-management-mojo.html}project-info-reports:issue-management}} is used to generate the Project Issue
   Management report.

   * {{{./licenses-mojo.html}project-info-reports:licenses}} is used to generate the Project Licenses report.

   * {{{./mailing-lists-mojo.html}project-info-reports:mailing-lists}} is used to generate the Project Mailing
   Lists report.

   * {{{./modules-mojo.html}project-info-reports:modules}} is used to generate the Project Modules report.

   * {{{./plugin-management-mojo.html}project-info-reports:plugin-management}} is used to generate the
   Project Plugin Management report.

   * {{{./plugins-mojo.html}project-info-reports:plugins}} is used to generate the Project Plugins report.

   * {{{./team-mojo.html}project-info-reports:team}} is used to generate the Project Team report.

   * {{{./scm-mojo.html}project-info-reports:scm}} is used to generate the Project Source Code Management report.

   * {{{./summary-mojo.html}project-info-reports:summary}} is used to generate the Project Summary report.

* Incompatibility Notice

  With the major version 3.0 several mojos and output filenames have been changed for alignment
  with their corresponding elements in the POM. In other words, mojos have the same names as their
  POM counterparts. To make you aware of that, see the following table for the upcoming changes:

*----------------------*------------------------*------------------------------*-----------------------------*
|| Goal Name           || New Goal Name         || Output name                 || New Output Name            |
*----------------------+------------------------+------------------------------+-----------------------------+
| <<<cim>>>            | <<<ci-management>>>    | <<<integration.html>>>       | <<<ci-management.html>>>    |
*----------------------+------------------------+------------------------------+-----------------------------+
| <<<mailing-list>>>   | <<<mailing-lists>>>    | <<<mail-lists.html>>>        | <<<mailing-lists.html>>>    |
*----------------------+------------------------+------------------------------+-----------------------------+
| <<<project-team>>>   | <<<team>>>             | <<<team-list.html>>>         | <<<team.html>>>             |
*----------------------+------------------------+------------------------------+-----------------------------+
| <<<license>>>        | <<<licenses>>>         | <<<license.html>>>           | <<<licenses.html>>>         |
*----------------------+------------------------+------------------------------+-----------------------------+
| <<<issue-management>>> | <<<issue-management>>> | <<<issue-tracking.html>>>    | <<<issue-management.html>>> |
*----------------------+------------------------+------------------------------+-----------------------------+
| <<<scm>>>            | \u2013                 | <<<source-repository.html>>> | <<<scm.html>>>              |
*----------------------+------------------------+------------------------------+-----------------------------+
| <<<summary>>>        | \u2013                 | <<<project-summary.html>>>   | <<<summary.html>>>          |
*----------------------+------------------------+------------------------------+-----------------------------+

  Details about this change can be found in {{{https://issues.apache.org/jira/browse/MPIR-323}MPIR-323}}.

* Usage

  General instructions on how to use the Project Info Reports 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

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

  * {{{./examples/selective-reports.html}Run Selective Reports}}

  * {{{./examples/individual-reports.html}Run Individual Reports}}

  * {{{./examples/scm-report.html}Customize the SCM Report}}

  * {{{./project-info.html}Overview of the reports generated for this plugin}}

  []

* Related Links

  * {{{http://maven.apache.org/plugins/localization.html}Localization of Plugins}}

  * {{{http://maven.apache.org/plugins/maven-site-plugin/examples/creatingskins.html}Skinning}}

  []
