 -----
 Apache Software Foundation Parent POM
 -----
 Benson Margulies
 Hervé Boutemy
 Karl Heinz Marbaise
 -----
 2016-05-09
 -----

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

Apache Software Foundation Parent POM

    This project consists of a POM that contains settings that are
    likely to be useful to any Apache project that is building and
    releasing code with Maven 3 (Maven 2.x is not supported any more since version 17). By using this project as a parent,
    a project gets these settings.

    Most project will want to override some of these settings.

    The following is a list of the items configured in this POM:

 * Top-level project properties:
    
  ** <<license>>: Apache License, version 2.0.
    
  ** <<organization>>: The Apache Software Foundation
    
  ** <<url>>: {{<<<https://www.apache.org/>>>}}. You should override this.
    
  ** <<repositories>>: The pom adds the Apache snapshot
     repository ({{<<<https://repository.apache.org/snapshots>>>}})
    
  ** <<distributionManagement>>: The POM sets up for releases to the Apache Nexus
     instance at
     {{<<<https://repository.apache.org/service/local/staging/deploy/maven2>>>}}
     and snapshots to
     {{<<<https://repository.apache.org/content/repositories/snapshots>>>}}. Note
     that there are POM parameters (<<<distMgmtSnapshotsName>>> and <<<distMgmtSnapshotsUrl>>>)
     that you can override to change the snapshot location. 
    
  ** <<mailingLists>>: The POM sets up generic Apache announcement
     lists. You should override this.
    
 * <<pluginManagement>>: The plugin management section specifies versions
    of a list of plugins. See the {{{./plugin-management.html}Plugin Management report}} for
    the complete list with versions. 
    
  ** The compiler plugin is set to default to Java $context.get("maven.compiler.source") and $context.get("project.build.sourceEncoding") source.
    
  ** the jar plugin is set to add default specification and implementation entries.
    
  ** the resources plugin is set for $context.get("project.build.sourceEncoding").
    
  ** the release plugin: the release plugin is set, via the
    \<arguments\> configuration element, to enable the
    <<apache-release>> profile for <<all>> executions and to disable
    \<useReleaseProfiles\>.  You can remove this with an empty
    \<arguments/\> element in the configuration of the release plugin.

 * <<plugins>>: The plugins section configures one execution:
    
  ** maven-remote-resources-plugin for {{{/apache-resource-bundles/}org.apache:apache-jar-resource-bundle:1.4}}.

  ** maven-site-plugin:attach-descriptor

The <<<apache-release>>> Profile

   As noted above, this pom configures the release plugin to enable
    the <<<apache-release>>> profile for all executions of the release
    plugin. The profile includes the following plugins:

 * maven-assembly-plugin:
    {{{/apache-resource-bundles/}org.apache.apache.resources:apache-source-release-assembly-descriptor:1.0.6}}
    is in the dependencies, and an execution is configured. The plugin
    is configured to take a <<<descriptorRef>>> name from the
    <<sourceReleaseAssemblyDescriptor>> property, which by default is
    set to <<<source-release>>> (zip only): you can override the property with
    <<<source-release-zip-tar>>> (both zip and tar) or <<<source-release-tar>>> (tar only) values.

 * maven-deploy-plugin

 * maven-source-plugin: configured to build and attach a source jar.

 * maven-javadoc-plugin: configured to build and attach a javadoc jar.

 * maven-gpg-plugin: configured to sign everything. It expects to find
    a passphrase in <<<$\{gpg.passphrase\}>>>, presumably in your <<<settings.xml>>>.
    
Settings Configuration
  
  You can have a look at the page in Apache website
  {{{https://www.apache.org/dev/publishing-maven-artifacts.html}Publishing Maven Artifacts}}.
  
  You can test your environment setup using <<<-Papache-release>>> with the command line.

History

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

*--------------+------------+
|| <<Version>> || <<Release Date>> ||
*--------------+------------+
#display( 20, '2018-07-07' )
*--------------+------------+
#display( 19, '2018-01-24' )
*--------------+------------+
#display( 18, '2016-05-18' )
*--------------+------------+
#display( 17, '2015-04-24' )
*--------------+------------+
#display( 16, '2014-11-13' )
*--------------+------------+
#display( 15, '2014-09-24' )
*--------------+------------+
#display( 14, '2014-03-06' )
*--------------+------------+
#display( 13, '2013-01-20' )
*--------------+------------+
#display( 12, '2012-11-01' )
*--------------+------------+
#display( 11, '2012-08-08' )
*--------------+------------+
#display( 10, '2011-08-09' )
*--------------+------------+
#display( 9, '2011-02-15' )
*--------------+------------+
#display( 8, '2010-11-26' )
*--------------+------------+
#display( 7, '2009-12-29' )
*--------------+------------+
