 -----
 Introduction
 -----
 Hervé Boutemy
 -----
 2013-07-24
 -----

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

  Classes to manage report plugin executions with Maven 3, through
  {{{./apidocs/org/apache/maven/reporting/exec/MavenReportExecutor.html}MavenReportExecutor}}
  ({{{./apidocs/org/apache/maven/reporting/exec/DefaultMavenReportExecutor.html}implementation}}):
  report plugins can be configured in <<<\<configuration\>>>> element of <<<maven-site-plugin>>> or any other
  report building plugin with following XML model corresponding to plugin's
  <<<List<{{{./apidocs/org/apache/maven/reporting/exec/ReportPlugin.html}ReportPlugin}}>>>> parameter:

+----+
<reportPlugins>
  <plugin>
    <groupId/>
    <artifactId/>
    <version/>
    <configuration/>
    <reports/>
    <reportSets>
      <reportSet>
        <id/>
        <configuration/>
        <reports/>
      </reportSet>
    </reportSets>
  </plugin>
</reportPlugins>
+----+

  Notice this is the model from plugins in
  {{{/ref/current/maven-model/maven.html#class_reporting}<<<\<reporting\>>>> section of POM}}:

  * without <<<\<inherited\>>>> element: reporting plugins configuration inheritance is not supported at this level
  (see {{{http://jira.codehaus.org/browse/MSITE-484}MSITE-484}}),

  * with additional <<<\<reports\>>>> list outside <<<\<reportSet\>>>> that simplifies reports configuration in usual cases,

  * with optional <<<\<version\>>>>: if no version is specified for a report plugin, version is determined by

    [[1]] searching for the plugin in the <<<build/plugins>>> section of the pom,
 
    [[2]] searching for the plugin in the <<<build/pluginManagement>>> section of the pom,

    [[3]] asking {{{/ref/current/maven-core/apidocs/org/apache/maven/plugin/version/PluginVersionResolver.html}PluginVersionResolver}}
    to get a fallback version and display a warning as it's not a recommended use.

    []

  []

  Maven 3 core makes an automatic transformation of <<<\<reporting\>>>> POM section (which supports configuration inheritance)
  to <<<maven-site-plugin>>>'s <<<reportPlugins>>> configuration through the
  {{{/ref/current/maven-model-builder/apidocs/org/apache/maven/model/plugin/ReportingConverter.html}ReportingConverter}}
  component.
