 -----
 Maven Project Parent POM
 -----
 Benson Margulies
 Hervé Boutemy
 Karl Heinz Marbaise
 -----
 2015-09-20
 -----

~~ 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:
~~ https://maven.apache.org/doxia/references/apt-format.html

Maven Project Parent POM

    This POM is the common parent of all of the Maven components
    in the Apache Maven project. Most of its contents are
    pinning down version numbers of plugins. It does 
    provide {{{./dependency-management.html}minimal dependencyManagement}} for
    plexus-component and plugin-tools annotations.

    This POM contains Maven developers information for the {{{./team-list.html}Project Team report}},
    sorted by role and id.
    See the LDAP extract for more accurate {{{https://people.apache.org/committers-by-project.html#maven}committers}}
    and {{{https://people.apache.org/committers-by-project.html#maven-pmc}PMC members}} lists. 

The <<<reporting>>> Profile

    This POM provides <<<reporting>>> profile for rendering documentation during site generation:

+-----+
mvn -Preporting site
+-----+

    See {{{./plugins.html}Plugins report}} for a list of configured report plugins.

The <<<jdk-toolchain>>> Profile

    This POM provides <<<jdk-toolchain>>> profile to activate JDK selection as a toolchain with version
    requirement configured as minimum java version for the project.

Site Publication

    This POM prepares site publication to {{{/developers/website/index.html}Apache Maven's site svnpubsub}}.
    Every inheriting POM needs to define <<<maven.site.path>>> property
    with relative path to <<<$\{project.artifactId}-LATEST>>> publication uri, and define <<<distributionManagement>>> to avoid
    automatic inheritance from parent:

+-----+
  <properties>
    <maven.site.path>xxx-archives/\${project.artifactId}-LATEST</maven.site.path>
  </properties>
  <distributionManagement>
    <site>
      <id>apache.website</id>
      <url>scm:svn:https://svn.apache.org/repos/infra/websites/production/maven/components/${maven.site.path}</url>
    </site>
  </distributionManagement>
+-----+

    Once this is configured, the site is published with:

+-----+
mvn -Preporting site site:stage
mvn scm-publish:publish-scm
+-----+

    See {{{/developers/website/deploy-component-reference-documentation.html}deploying Maven components reference documentation}}
    for more information.

* Mono Module: <<<site.scm-deploy>>> profile

    If the build is mono module, previous 2-steps publication can be simplified by activating <<<site.scm-deploy>>> profile
    through <<<maven.site.scm-deploy>>> property

+-----+
  <properties>
    <maven.site.scm-deploy>true</maven.site.scm-deploy>
  </properties>
+-----+

    Once this is configured, the site can be published in only one command:

+-----+
mvn -Preporting site-deploy
+-----+

History

#if( $project.version.endsWith( "SNAPSHOT" ) )
#**##set( $prev = 30 )
  master: {{{https://github.com/apache/maven-parent/tree/master/pom.xml}$project.version}}
  ({{{https://gitbox.apache.org/repos/asf?p=maven-parent.git;a=blobdiff;f=pom.xml;hb=master;hpb=maven-parent-$prev}diff}},
  {{{https://github.com/apache/maven-parent/compare/maven-parent-$prev...master}commits}})
#end
#macro ( display $version $date )
#**##if ( $version == 30 ) #set( $prev = 27 )#else#set( $prev = $version - 1 )#end
|  {{{https://github.com/apache/maven-parent/tree/maven-parent-$version/pom.xml}$version}}
| ({{{https://gitbox.apache.org/repos/asf?p=maven-parent.git;a=blobdiff;f=pom.xml;hb=maven-parent-$version;hpb=maven-parent-$prev}diff}},
|  {{{https://github.com/apache/maven-parent/compare/maven-parent-$prev...maven-parent-$version}commits}}) | $date |
#end

    As of version 27, this POM sets the Java source and target versions to 1.6. Thus, as any plugin (or other component)
    moved to version 27+ of this POM, it moves to requiring Java 1.6 (was Java 1.5 since version 21).

*--------------+------------+
|| <<Version>> || <<Release Date>> ||
*--------------+------------+
#display( 30, '2016-05-26' )
*--------------+------------+
#display( 27, '2015-09-23' )
*--------------+------------+
#display( 26, '2014-11-13' )
*--------------+------------+
#display( 25, '2014-10-22' )
*--------------+------------+
#display( 24, '2014-03-27' )
*--------------+------------+
#display( 23, '2013-01-21' )
*--------------+------------+
#display( 22, '2012-08-08' )
*--------------+------------+
#display( 21, '2011-08-18' )
*--------------+------------+
#display( 20, '2011-06-15' )
*--------------+------------+
#display( 19, '2011-02-15' )
*--------------+------------+
#display( 18, '2010-11-26' )
*--------------+------------+
#display( 17, '2010-11-04' )
*--------------+------------+
