 ----
 POM Reference
 -----
 Eric Redmond, et al.
 Karl Heinz Marbaise
 -----
 2019-12-31
 -----

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

POM Reference

  [[1]] {{{Introduction}Introduction}}

    [[1]] {{{What_is_the_POM}What is the POM?}}

    [[2]] {{{Quick_Overview}Quick Overview}}

  [[2]] {{{The_Basics}The Basics}}

    [[1]] {{{Maven_Coordinates}Maven Coordinates}}

    [[2]] {{{POM_Relationships}POM Relationships}}

      [[1]] {{{Dependencies}Dependencies}}

        [[1]] {{{Dependency_Version_Requirement_Specification}Dependency Version Requirement Specification}}

        [[2]] {{{Version_Order_Specification}Version Order Specification}}

        [[3]] {{{Version_Order_Testing}Version Order Testing}}

        [[4]] {{{Exclusions}Exclusions}}

      [[2]] {{{Inheritance}Inheritance}}

        [[1]] {{{The_Super_POM}The Super POM}}

        [[2]] {{{Dependency_Management}Dependency Management}}

      [[3]] {{{Aggregation}Aggregation (or Multi-Module)}}

        [[1]] {{{Inheritance_v._Aggregation}Inheritance v. Aggregation}}

    [[3]] {{{Properties}Properties}}

  [[3]] {{{Build_Settings}Build Settings}}

    [[1]] {{{Build}Build}}

      [[1]] {{{BaseBuild_Element}The BaseBuild Element Set}}

        [[1]] {{{Resources}Resources}}

        [[2]] {{{Plugins}Plugins}}

        [[3]] {{{Plugin_Management}Plugin Management}}

      [[2]] {{{Build_Element}The Build Element Set}}

        [[1]] {{{Directories}Directories}}

        [[2]] {{{Extensions}Extensions}}

    [[2]] {{{Reporting}Reporting}}

      [[1]] {{{Report_Sets}Report Sets}}

  [[4]] {{{More_Project_Information}More Project Information}}

    [[1]] {{{Licenses}Licenses}}

    [[2]] {{{Organization}Organization}}

    [[3]] {{{Developers}Developers}}

    [[4]] {{{Contributors}Contributors}}

  [[5]] {{{Environment_Settings}Environment Settings}}

    [[1]] {{{Issue_Management}Issue Management}}

    [[2]] {{{Continuous_Integration_Management}Continuous Integration Management}}

    [[3]] {{{Mailing_Lists}Mailing Lists}}

    [[4]] {{{SCM}SCM}}

    [[5]] {{{Prerequisites}Prerequisites}}

    [[6]] {{{Repositories}Repositories}}

    [[7]] {{{Plugin_Repositories}Plugin Repositories}}

    [[8]] {{{Distribution_Management}Distribution Management}}

      [[1]] {{{Repository}Repository}}

      [[2]] {{{Site_Distribution}Site Distribution}}

      [[3]] {{{Relocation}Relocation}}

    [[9]] {{{Profiles}Profiles}}

      [[1]] {{{Activation}Activation}}

      [[2]] {{{The_BaseBuild_Element_Set}The BaseBuild Element Set <(revisited)>}}

  [[6]] {{{Final}Final}}

  []

{Introduction}

  * {{{/xsd/maven-4.0.0.xsd}The POM 4.0.0 XSD}} and
    {{{/ref/current/maven-model/maven.html}descriptor reference documentation}}

* {What is the POM?}

  POM stands for "Project Object Model". It is an XML representation of a Maven project held in a file
  named <<<pom.xml>>>. When in the presence of Maven folks, speaking of a project is speaking in the philosophical
  sense, beyond a mere collection of files containing code. A project contains configuration files, as well
  as the developers involved and the roles they play, the defect tracking system, the organization and
  licenses, the URL of where the project lives, the project's dependencies, and all of the other little
  pieces that come into play to give code life. It is a one-stop-shop for all things concerning the project.
  In fact, in the Maven world, a project does not need to contain any code at all, merely a <<<pom.xml>>>.

* {Quick Overview}

  This is a listing of the elements directly under the POM's project element. Notice that <<<modelVersion>>>
  contains 4.0.0. That is currently the only supported POM version, and is always required.

+--------------------------+
<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                      http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <!-- The Basics -->
  <groupId>...</groupId>
  <artifactId>...</artifactId>
  <version>...</version>
  <packaging>...</packaging>
  <dependencies>...</dependencies>
  <parent>...</parent>
  <dependencyManagement>...</dependencyManagement>
  <modules>...</modules>
  <properties>...</properties>

  <!-- Build Settings -->
  <build>...</build>
  <reporting>...</reporting>

  <!-- More Project Information -->
  <name>...</name>
  <description>...</description>
  <url>...</url>
  <inceptionYear>...</inceptionYear>
  <licenses>...</licenses>
  <organization>...</organization>
  <developers>...</developers>
  <contributors>...</contributors>

  <!-- Environment Settings -->
  <issueManagement>...</issueManagement>
  <ciManagement>...</ciManagement>
  <mailingLists>...</mailingLists>
  <scm>...</scm>
  <prerequisites>...</prerequisites>
  <repositories>...</repositories>
  <pluginRepositories>...</pluginRepositories>
  <distributionManagement>...</distributionManagement>
  <profiles>...</profiles>
</project>
+--------------------------+

{The Basics}

  The POM contains all necessary information about a project, as well as configurations of plugins to be
  used during the build process. It is the declarative manifestation of the "who", "what",
  and "where", while the build lifecycle is the "when" and "how". That is not to say that the POM cannot
  affect the flow of the lifecycle - it can. For example, by configuring the <<<maven-antrun-plugin>>>, one can
  embed Apache Ant tasks inside of the POM. It is ultimately a declaration, however. Whereas a
  <<<build.xml>>> tells Ant precisely what to do when it is run (procedural), a POM states its
  configuration (declarative). If some external force causes the lifecycle to skip the Ant plugin
  execution, it does not stop the plugins that are executed from doing their magic. This is unlike a
  <<<build.xml>>> file, where tasks are almost always dependant on the lines executed before it.

+--------------------------+
<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                      http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>org.codehaus.mojo</groupId>
  <artifactId>my-project</artifactId>
  <version>1.0</version>
</project>
+--------------------------+

* {Maven Coordinates}

  The POM defined above is the bare minimum that Maven allows. <<<groupId:artifactId:version>>> are all
  required fields (although, groupId and version do not need to be explicitly defined if they are inherited
  from a parent - more on inheritance later). The three fields act much like an address and timestamp
  in one. This marks a specific place in a repository, acting like a coordinate system for Maven projects:

  * <<groupId>>:
  This is generally unique amongst an organization or a project. For example, all core
  Maven artifacts do (well, should) live under the groupId <<<org.apache.maven>>>. Group ID's do not
  necessarily use the dot notation, for example, the junit project. Note that the dot-notated
  groupId does not have to correspond to the package structure that the project contains. It is,
  however, a good practice to follow. When stored within a repository, the group acts much like the
  Java packaging structure does in an operating system. The dots are replaced by OS specific directory
  separators (such as '/' in Unix) which becomes a relative directory structure from the base
  repository. In the example given, the <<<org.codehaus.mojo>>> group lives within the directory
  <<<$M2_REPO/org/codehaus/mojo>>>.

  * <<artifactId>>:
  The artifactId is generally the name that the project is known by. Although the groupId is
  important, people within the group will rarely mention the groupId in discussion (they are often all be the
  same ID, such as the {{{http://www.mojohaus.org/}MojoHaus}} project groupId: <<<org.codehaus.mojo>>>).
  It, along with the groupId, creates a key that separates this project from every other project
  in the world (at least, it should :) ). Along with the groupId, the artifactId fully defines
  the artifact's living quarters within the repository. In the case of the above project, <<<my-project>>> lives
  in <<<$M2_REPO/org/codehaus/mojo/my-project>>>.

  * <<version>>:
  This is the last piece of the naming puzzle. <<<groupId:artifactId>>> denotes a single project but
  they cannot delineate which incarnation of that project we are talking about. Do we want the <<<junit:junit>>>
  of 2018 (version 4.12), or of 2007 (version 3.8.2)? In short: code changes, those changes
  should be versioned, and this element keeps those versions in line. It is also used within an artifact's
  repository to separate versions from each other. <<<my-project>>> version 1.0 files live in the directory
  structure <<<$M2_REPO/org/codehaus/mojo/my-project/1.0>>>.

  []

  The three elements given above point to a specific version of a project, letting Maven know <who> we
  are dealing with, and <when> in its software lifecycle we want them.

* <<packaging>>

  Now that we have our address structure of <<<groupId:artifactId:version>>>, there is one more standard
  label to give us a really complete <what>: that is the project's packaging. In our
  case, the example POM for <<<org.codehaus.mojo:my-project:1.0>>> defined above will be packaged as a
  <<<jar>>>. We could make it into a <<<war>>> by declaring a different packaging:

+-----------------+
<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                      http://maven.apache.org/xsd/maven-4.0.0.xsd">
  ...
  <packaging>war</packaging>
  ...
</project>
+-----------------+

  When no packaging is declared, Maven assumes the packaging is the default: <<<jar>>>. The valid types
  are Plexus role-hints (read more on Plexus for a explanation of roles and role-hints) of the component role
  <<<org.apache.maven.lifecycle.mapping.LifecycleMapping>>>. The current core packaging values are:
  <<<pom>>>, <<<jar>>>, <<<maven-plugin>>>, <<<ejb>>>, <<<war>>>, <<<ear>>>, <<<rar>>>.
  These define the default list of goals which execute on each corresponding build lifecycle stage for
  a particular package structure:
  see {{{/ref/current/maven-core/default-bindings.html}Plugin Bindings for default Lifecycle Reference}} for details.

* {POM Relationships}

  One powerful aspect of Maven is its handling of project relationships: this includes
  dependencies (and transitive dependencies), inheritance, and aggregation (multi-module projects).

  Dependency management has a long tradition of being a complicated mess for
  anything but the most trivial of projects. <"Jarmageddon"> quickly ensues as the dependency tree
  becomes large and complicated. <"Jar Hell"> follows, where versions of dependencies on one system
  are not equivalent to the versions developed with, either by the wrong version given, or conflicting
  versions between similarly named jars.

  Maven solves both problems through a common local repository
  from which to link projects correctly, versions and all.

** {Dependencies}

  The cornerstone of the POM is its {{{/ref/current/maven-model/maven.html#class_dependency}dependency}} list.
  Most projects depend on others to build
  and run correctly. If all Maven does for you is manage this list, you have gained a lot.
  Maven downloads and links the dependencies on compilation, as well as on other goals that require them.
  As an added bonus, Maven brings in the dependencies of those dependencies (transitive dependencies),
  allowing your list to focus solely on the dependencies your project requires.

+-----------------+
<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                      https://maven.apache.org/xsd/maven-4.0.0.xsd">
  ...
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <type>jar</type>
      <scope>test</scope>
      <optional>true</optional>
    </dependency>
    ...
  </dependencies>
  ...
</project>
+-----------------+

  * <<groupId>>, <<artifactId>>, <<version>>:\
  You will see these elements often. This trinity is used to compute the Maven coordinate
  of a specific project in time, demarcating it as a dependency of this project. The purpose
  of this computation is to select a version that matches all the dependency declarations
  (due to transitive dependencies, there can be multiple dependency declarations for the
  same artifact). The values should be:

    * <<groupId>>, <<artifactId>>: directly the corresponding coordinates of the dependency,

    * <<version>>: a <<dependency version requirement specification>>, that is used to compute the dependency's effective version.

  Since the dependency is described by Maven coordinates, you may be thinking:
  "This means that my project can only depend upon Maven artifacts!" The answer is, "Of course, but that's a
  good thing." This forces you to depend solely on dependencies that Maven can manage.

  There are times,
  unfortunately, when a project cannot be downloaded from the central Maven repository. For example, a project
  may depend upon a jar that has a closed-source license which prevents it from being in a central repository.
  There are three methods for dealing with this scenario.

   [[1]] Install the dependency locally using the install plugin. The method is the simplest recommended method. For example:

---------------
mvn install:install-file -Dfile=non-maven-proj.jar -DgroupId=some.group -DartifactId=non-maven-proj -Dversion=1 -Dpackaging=jar
---------------

        Notice that an address is still required, only this time you use the command line and the install plugin will
        create a POM for you with the given address.

   [[2]] Create your own repository and deploy it there. This is a favorite method for companies with an
        intranet and need to be able to keep everyone in synch. There is a Maven goal called
        <<<deploy:deploy-file>>> which is similar to the <<<install:install-file>>> goal (read the plugin's goal
        page for more information).

   [[3]] Set the dependency scope to <<<system>>> and define a <<<systemPath>>>. This is not recommended, however,
        but leads us to explaining the following elements:

   []

  * <<classifier>>:\
  The classifier distinguishes artifacts that were built from the same POM but differ in content. It is
  some optional and arbitrary string that - if present - is appended to the artifact name just after the version number.

  As a motivation for this element, consider for example a project that offers an artifact targeting Java 11 but at the
  same time also an artifact that still supports Java 1.8. The first artifact could be equipped with the classifier
  <<<jdk11>>> and the second one with <<<jdk8>>> such that clients can choose which one to use.

  Another common use case for classifiers is to attach secondary artifacts to the project's main artifact. If
  you browse the Maven central repository, you will notice that the classifiers <<<sources>>> and <<<javadoc>>> are used
  to deploy the project source code and API docs along with the packaged class files.

  * <<type>>:\
  Corresponds to the chosen dependency type. This defaults to <<<jar>>>. While it usually represents
  the extension on the filename of the dependency, that is not always the case: a type can be mapped to a
  different extension and a classifier. The type often corresponds to the packaging used, though this is
  also not always the case. Some examples are <<<jar>>>, <<<ejb-client>>> and <<<test-jar>>>:
  see {{{/ref/current/maven-core/artifact-handlers.html}default artifact handlers}} for a list. New types can be
  defined by plugins that set <<<extensions>>> to true, so this is not a complete list.

  * <<scope>>:\
  This element refers to the classpath of the task at hand (compiling and runtime, testing, etc.) as well as
  how to limit the transitivity of a dependency. There are five scopes available:

    * <<compile>> - this is the default scope, used if none is specified. Compile dependencies are available in all
      classpaths. Furthermore, those dependencies are propagated to dependent projects.

    * <<provided>> - this is much like compile, but indicates you expect the JDK or a container to provide it at
      runtime. It is only available on the compilation and test classpath, and is not transitive.

    * <<runtime>> - this scope indicates that the dependency is not required for compilation, but is for execution.
      It is in the runtime and test classpaths, but not the compile classpath.

    * <<test>> - this scope indicates that the dependency is not required for normal use of the application, and
      is only available for the test compilation and execution phases. It is not transitive.

    * <<system>> - this scope is similar to <<<provided>>> except that you have to provide the JAR which contains
      it explicitly. The artifact is always available and is not looked up in a repository.

  * <<systemPath>>:\
  is used <only> if the dependency <<<scope>>> is <<<system>>>. Otherwise, the build will fail if this
  element is set. The path must be absolute, so it is recommended to use a property to specify the
  machine-specific path (more on <<<properties>>> below),
  such as <<<$\{java.home\}/lib>>>. Since it is assumed that system scope dependencies are installed <a priori>,
  Maven does not check the repositories for the project, but instead checks to ensure that the file exists.
  If not, Maven fails the build and suggests that you download and install it manually.

  * <<optional>>:\
  Marks a dependency optional when this project itself is a dependency.
  For example, imagine a project <<<A>>> that depends upon project <<<B>>> to
  compile a portion of code that may not be used at runtime, then we may have no need for project <<<B>>>
  for all project. So if project <<<X>>> adds project <<<A>>> as its own dependency, then Maven does
  not need to install project <<<B>>> at all. Symbolically, if <<<=\>>>> represents a required dependency,
  and <<<--\>>>> represents optional, although <<<A=\>B>>> may be the case when building A
  <<<X=\>A--\>B>>> would be the case when building <<<X>>>.

  In the shortest terms, <<<optional>>> lets other projects know that, when you use this project, you
  do not require this dependency in order to work correctly.

*** {Dependency Version Requirement Specification}

  Dependencies' <<<version>>> elements define version requirements, which are used to compute dependency versions. Soft requirements can be replaced by
  different versions of the same artifact found elsewhere in the dependency 
  graph. Hard requirements mandate a particular version or versions and
  override soft requirements. If there are no versions of a dependency that
  satisfy all the hard requirements for that artifact, the build fails.

  Version requirements have the following syntax:

  * <<<1.0>>>: Soft requirement for 1.0. Use 1.0 if no other version appears earlier in the dependency tree.

  * <<<[1.0]>>>: Hard requirement for 1.0. Use 1.0 and only 1.0.

  * <<<(,1.0]>>>: Hard requirement for any version \<= 1.0. 

  * <<<[1.2,1.3]>>>: Hard requirement for any version between 1.2 and 1.3 inclusive.

  * <<<[1.0,2.0)>>>: 1.0 \<= x \< 2.0; Hard requirement for any version between 1.0 inclusive and 2.0 exclusive.

  * <<<[1.5,)>>>: Hard requirement for any version greater than or equal to 1.5.

  * <<<(,1.0],[1.2,)>>>: Hard requirement for any version less than or equal to 1.0 than or greater than
    or equal to 1.2, but not 1.1. Multiple requirements are separated by commas.

  * <<<(,1.1),(1.1,)>>>: Hard requirement for any version except 1.1; for example because 1.1 has a critical vulnerability.
  
  Maven picks the highest version of each project that satisfies all the
  hard requirements of the dependencies on that project. If no version
  satisfies all the hard requirements, the build fails.

*** {Version Order Specification}:

  If version strings are syntactically correct  {{{https://semver.org/spec/v1.0.0.html}Semantic Versioning 1.0.0}}
  version numbers, then in almost all cases version comparison follows the precedence rules outlined in that specification.
  These versions are the commonly encountered alphanumeric ASCII strings such as 2.15.2-alpha.
  More precisely, this is true if both version numbers to be compared match the "valid semver"
  production in the BNF grammar in the semantic versioning specification.
  Maven does not consider any semantics implied by that specification.
  
  <<Important>>: This is only true for Semantic Versioning <1.0.0>. The Maven version order algorithm
  is not compatible with Semantic Versioning <2.0.0>. In particular, Maven does not special case the
  plus sign or consider build identifiers.

  When version strings do not follow semantic versioning, a more complex set of rules is required. 
  The Maven coordinate is split in tokens between dots ('<<<.>>>'), hyphens ('<<<->>>') and transitions between digits and characters.
  The separator is recorded and will have effect on the order. A transition 
  between digits and characters is equivalent to a hyphen.
  Empty tokens are replaced with "<<<0>>>". This gives a sequence of version numbers (numeric tokens) and version qualifiers (non-numeric tokens)
  with "<<<.>>>" or "<<<->>>" prefixes.

  Splitting and Replacing Examples:

  * <<<1-1.foo-bar1baz-.1>>> -> <<<1-1.foo-bar-1-baz-0.1>>>

  []

  Then, starting from the end of the version, the trailing "null" values 
  (<<<0>>>, <<<"">>>, "<<<final>>>", "<<<ga>>>") are trimmed. This process is
  repeated at each remaining hyphen from end to start.

  Trimming Examples:

  * <<<1.0.0>>> -> <<<1>>>

  * <<<1.ga>>> -> <<<1>>>

  * <<<1.final>>> -> <<<1>>>

  * <<<1.0>>> -> <<<1>>>

  * <<<1.>>> -> <<<1>>>

  * <<<1->>> -> <<<1>>>

  * <<<1.0.0-foo.0.0>>> -> <<<1-foo>>>

  * <<<1.0.0-0.0.0>>> -> <<<1>>>

  []

  The version order is the <<<lexicographical order>>> on this sequence of prefixed tokens, the shorter one
  padded with enough "null" values with matching prefix to have the same length as the longer one. Padded "null" values depend on the prefix of the other version: 0 for '.', "" for '-'.
  The prefixed token order is:

  * if the prefix is the same, then compare the token:

    * Numeric tokens have the natural order.

    * Non-numeric ("qualifiers") tokens have the alphabetical order, except for the following tokens which come first in this order:

    "<<<alpha>>>" \< "<<<beta>>>" \< "<<<milestone>>>" \< "<<<rc>>>" = "<<<cr>>>" \< "<<<snapshot>>>" \< "" = "<<<final>>>" = "<<<ga>>>" \< "<<<sp>>>"

        * the "<<<alpha>>>", "<<<beta>>>" and "<<<milestone>>>" qualifiers can respectively be shortened to "a", "b" and "m" when directly followed by a number.

  * else "<<<.qualifier>>>" \< "<<<-qualifier>>>" \< "<<<-number>>>" \< "<<<.number>>>"

  []

  End Result Examples:

  * "<<<1>>>" \< "<<<1.1>>>" (number padding)

  * "<<<1-snapshot>>>" \< "<<<1>>>" \< "<<<1-sp>>>" (qualifier padding)

  * "<<<1-foo2>>>" \< "<<<1-foo10>>>" (correctly automatically "switching" to numeric order)

  * "<<<1.foo>>>" \< "<<<1-foo>>>" \< "<<<1-1>>>" \< "<<<1.1>>>"

  * "<<<1.ga>>>"  = "<<<1-ga>>>"  = "<<<1-0>>>" = "<<<1.0>>>" = "<<<1>>>" (removing of trailing "null" values)

  * "<<<1-sp>>>"   \> "<<<1-ga>>>"

  * "<<<1-sp.1>>>"  \> "<<<1-ga.1>>>"

  * "<<<1-sp-1>>>" \< "<<<1-ga-1>>>" = "<<<1-1>>>" (trailing "null" values at each hyphen)

  * "<<<1-a1>>>"  = "<<<1-alpha-1>>>"

  Note: Contrary to what was stated in some design documents, for version order, snapshots are not treated differently than releases or any other qualifier.

*** {Version Order Testing}:

    The maven distribution includes a tool to check version order. It was used to produce the examples in the previous paragraphs. Feel free to run it yourself when in doubt. You can run it like this:

----------------------------------------
java -jar ${MAVEN_HOME}/lib/maven-artifact-3.3.9.jar [versions...]
----------------------------------------

    example:

----------------------------------------
$ java -jar ./lib/maven-artifact-3.3.9.jar  1 2 1.1
Display parameters as parsed by Maven (in canonical form) and comparison result:
1. 1 == 1
   1 < 2
2. 2 == 2
   2 > 1.1
3. 1.1 == 1.1
----------------------------------------

*** {Exclusions}

  Exclusions tell Maven not to include the
  specified project that is a dependency of this dependency (in other words, its transitive
  dependency). For example, the <<<maven-embedder>>> requires <<<maven-core>>>, and we do not
  wish to use it or its dependencies, then we would add it as an <<<exclusion>>>.

+-----------------------------+
<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                      https://maven.apache.org/xsd/maven-4.0.0.xsd">
  ...
  <dependencies>
    <dependency>
      <groupId>org.apache.maven</groupId>
      <artifactId>maven-embedder</artifactId>
      <version>2.0</version>
      <exclusions>
        <exclusion>
          <groupId>org.apache.maven</groupId>
          <artifactId>maven-core</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    ...
  </dependencies>
  ...
</project>
+-----------------------------+

  It is also sometimes useful to clip a dependency's transitive dependencies. A dependency may have incorrectly
  specified scopes, or dependencies that conflict with other dependencies in your project. Using wildcard excludes makes it easy to exclude all a dependency's
  transitive dependencies. In the case below you may be working with the maven-embedder and you want to manage
  the dependencies you use yourself, so you clip all the transitive dependencies:

+-----------------------------+
<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                      https://maven.apache.org/xsd/maven-4.0.0.xsd">
  ...
  <dependencies>
    <dependency>
      <groupId>org.apache.maven</groupId>
      <artifactId>maven-embedder</artifactId>
      <version>3.1.0</version>
      <exclusions>
        <exclusion>
          <groupId>*</groupId>
          <artifactId>*</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    ...
  </dependencies>
  ...
</project>
+-----------------------------+

  * <<exclusions>>:
  Exclusions contain one or more <<<exclusion>>> elements, each containing a <<<groupId>>> and
  <<<artifactId>>> denoting a dependency to exclude. Unlike <<<optional>>>, which may or may not
  be installed and used, <<<exclusions>>> actively remove themselves from the dependency tree.

** {Inheritance}

  One powerful addition that Maven brings to build management is the concept of project inheritance.
  Although in build systems such as Ant, inheritance can certainly be simulated, Maven has gone the
  extra step in making project inheritance explicit to the project object model.

+-----------------------------+
<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                      https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>org.codehaus.mojo</groupId>
  <artifactId>my-parent</artifactId>
  <version>2.0</version>
  <packaging>pom</packaging>
</project>
+-----------------------------+

  The <<<packaging>>> type required to be <<<pom>>> for
  <parent> and <aggregation> (multi-module) projects. These types define the goals bound
  to a set of lifecycle stages. For example, if packaging is <<<jar>>>, then the
  <<<package>>> phase will execute the <<<jar:jar>>> goal. Now we may add values to the
  parent POM, which will be inherited by its children. Most elements from the parent POM
  are inherited by its children, including:

    * groupId

    * version

    * description

    * url

    * inceptionYear

    * organization

    * licenses

    * developers

    * contributors

    * mailingLists

    * scm

    * issueManagement

    * ciManagement

    * properties

    * dependencyManagement

    * dependencies

    * repositories

    * pluginRepositories

    * build

      * plugin executions with matching ids

      * plugin configuration

      * etc.

    * reporting

    * profiles

  Notable elements which are <<<not>>> inherited include:

    * artifactId

    * name

    * prerequisites

    []

+-----------------------------+
<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                      https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <parent>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>my-parent</artifactId>
    <version>2.0</version>
    <relativePath>../my-parent</relativePath>
  </parent>

  <artifactId>my-project</artifactId>
</project>
+-----------------------------+

  Notice the <<<relativePath>>> element. It is not required, but may be used as a signifier
  to Maven to first search the path given for this project's parent, before searching the
  local and then remote repositories.

  To see inheritance in action, just have a look at the
  {{{https://svn.apache.org/viewvc/maven/pom/trunk/asf/pom.xml?view=markup}ASF}} or
  {{{https://svn.apache.org/viewvc/maven/pom/trunk/maven/pom.xml?view=markup}Maven}} parent POM's.

*** {The Super POM}

  Similar to the inheritance of objects in object oriented programming, POMs that extend
  a parent POM inherit certain values from that parent. Moreover, just as Java objects
  ultimately inherit from <<<java.lang.Object>>>, all Project Object Models inherit from
  a base Super POM. The snippet below is the Super POM for Maven 3.5.4.

%{snippet|id=superpom|url=https://raw.githubusercontent.com/apache/maven/maven-3.5.4/maven-model-builder/src/main/resources/org/apache/maven/model/pom-4.0.0.xml}

  You can take a look at how the Super POM affects your Project Object Model by creating a
  minimal <<<pom.xml>>> and executing on the command line: <<<mvn help:effective-pom>>>

*** {Dependency Management}

  Besides inheriting certain top-level elements, parents have elements to configure values for
  child POMs and transitive dependencies. One of those elements is
  <<<dependencyManagement>>>.

  * <<dependencyManagement>>:
  is used by a POM to help manage dependency information across all of its children.
  If the <<<my-parent>>> project uses <<<dependencyManagement>>> to define a dependency on
  <<<junit:junit:4.12>>>, then POMs inheriting from this one can set their dependency giving
  the <<<groupId>>>=<<<junit>>> and <<<artifactId>>>=<<<junit>>> only and Maven will fill in
  the <<<version>>> set by the parent. The benefits of this method are obvious. Dependency
  details can be set in one central location, which propagates to all inheriting POMs.

  Note that the version and scope of artifacts which are incorporated from transitive dependencies
  are also controlled by version specifications in a dependency management section. This can lead
  to unexpected consequences. Consider a case in which your project uses two dependences,
  <<<dep1>>> and <<<dep2>>>. <<<dep2>>> in turn also uses <<<dep1>>>, and requires
  a particular minimum version to function. If you then use <<<dependencyManagement>>>
  to specify an older version, <<<dep2>>> will be forced to use the older version, and fail.
  So, you must be careful to check the entire dependency tree to avoid this problem;
  <<<mvn dependency:tree>>> is helpful.


** {Aggregation} (or Multi-Module)

  A project with modules is known as a multi-module, or aggregator project. Modules are projects
  that this POM lists, and are executed as a group. A <<<pom>>> packaged project may
  aggregate the build of a set of projects by listing them as modules, which are relative paths to the
  directories or the POM files of those projects.

+-----------------------------+
<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                      https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>org.codehaus.mojo</groupId>
  <artifactId>my-parent</artifactId>
  <version>2.0</version>
  <packaging>pom</packaging>

  <modules>
    <module>my-project</module>
    <module>another-project</module>
    <module>third-project/pom-example.xml</module>
  </modules>
</project>
+-----------------------------+

  You do not need to consider the inter-module dependencies yourself when listing the modules; i.e. the
  ordering of the modules given by the POM is not important. Maven will topologically sort the modules
  such that dependencies are always build before dependent modules.

  To see aggregation in action, have a look at the
  {{{https://svn.apache.org/viewvc/maven/maven-3/trunk/pom.xml?view=markup}Maven}} or
  {{{https://svn.apache.org/viewvc/maven/plugins/trunk/pom.xml?view=markup}Maven Core Plugins}} base POM's.

*** A final note on {Inheritance v. Aggregation}

  Inheritance and aggregation create a nice dynamic to control builds through a single,
  high-level POM. You often see projects that are both parents and aggregators.
  For example, the entire Maven core runs through a single base POM
  {{{https://svn.apache.org/viewvc/maven/maven-3/trunk/pom.xml?view=markup}<<<org.apache.maven:maven>>>}},
  so building the Maven project can be executed by a single command: <<<mvn compile>>>.
  However, an aggregator project and a parent project are both POM projects, they are not
  one and the same and should not be confused. A POM project may be inherited from - but does
  not necessarily have - any modules that it aggregates. Conversely, a POM project may aggregate
  projects that do not inherit from it.

* {Properties}

  Properties are the last required piece to understand POM basics. Maven properties
  are value placeholder, like properties in Ant. Their values are accessible anywhere
  within a POM by using the notation <<<$\{X\}>>>, where <<<X>>> is the property. Or they can be used by plugins
  as default values, for example:

+-----------------------+
<project>
  ...
  <properties>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  </properties>
  ...
</project>
+-----------------------+

  They come in five different styles:

  [[1]]  <<<env.X>>>: Prefixing a variable with "env." will return the shell's environment variable. For example,
  <<<$\{env.PATH\}>>> contains the PATH environment variable.

  <Note:> While environment variables themselves are case-insensitive on Windows, lookup of properties is
  case-sensitive. In other words, while the Windows shell returns the same value for <<<%PATH%>>> and <<<%Path%>>>,
  Maven distinguishes between <<<$\{env.PATH\}>>> and <<<$\{env.Path\}>>>. <<The names of environment
  variables are normalized to all upper-case>> for the sake of reliability.

  [[2]]  <<<project.x>>>: A dot (.) notated path in the POM will contain the corresponding element's value.
  For example: <<<\<project\>\<version\>1.0\</version\>\</project\>>>> is accessible via
  <<<$\{project.version\}>>>.

  [[3]]  <<<settings.x>>>: A dot (.) notated path in the <<<settings.xml>>> will contain the corresponding element's value.
  For example: <<<\<settings\>\<offline\>false\</offline\>\</settings\>>>> is accessible via
  <<<$\{settings.offline\}>>>.

  [[4]]  Java System Properties: All properties accessible via <<<java.lang.System.getProperties()>>> are
  available as POM properties, such as <<<$\{java.home\}>>>.

  [[5]]  <<<x>>>: Set within a <<<\<properties /\>>>> element in the POM. The value of
  <<<\<properties\>\<someVar\>value\</someVar\>\</properties\>>>> may be used as <<<$\{someVar\}>>>.

  []

{Build Settings}

  Beyond the basics of the POM given above, there are two more elements that must be understood before
  claiming basic competency of the POM. They are the <<<build>>> element, that handles things like
  declaring your project's directory structure and managing plugins; and the <<<reporting>>> element,
  that largely mirrors the build element for reporting purposes.

* {Build}

  According to the POM 4.0.0 XSD, the <<<build>>> element is conceptually divided into two parts:
  there is a <<<BaseBuild>>> type which contains the set of elements common to both <<<build>>> elements
  (the top-level build element under <<<project>>> and the build element under <<<profiles>>>,
  covered below); and there is the <<<Build>>> type, which contains the <<<BaseBuild>>> set as well as more
  elements for the top level definition. Let us begin with an analysis of the common elements between
  the two.

  <Note: These different> <<<build>>> <elements may be denoted "project build" and "profile build".>

+-----------------------+
<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                      https://maven.apache.org/xsd/maven-4.0.0.xsd">
  ...
  <!-- "Project Build" contains more elements than just the BaseBuild set -->
  <build>...</build>

  <profiles>
    <profile>
      <!-- "Profile Build" contains a subset of "Project Build"s elements -->
      <build>...</build>
    </profile>
  </profiles>
</project>
+-----------------------+

** The {BaseBuild Element} Set

  <<<BaseBuild>>> is exactly as it sounds: the base set of elements between the two <<<build>>> elements in the POM.

-------------------------------
<build>
  <defaultGoal>install</defaultGoal>
  <directory>${basedir}/target</directory>
  <finalName>${artifactId}-${version}</finalName>
  <filters>
    <filter>filters/filter1.properties</filter>
  </filters>
  ...
</build>
-------------------------------

  * <<defaultGoal>>:
  the default goal or phase to execute if none is given. If a goal is given, it should be defined as it is
  in the command line (such as <<<jar:jar>>>). The same goes for if a phase is defined (such as install).

  * <<directory>>:
  This is the directory where the build will dump its files or, in Maven parlance, the build's target.
  It aptly defaults to <<<$\{basedir\}/target>>>.

  * <<finalName>>:
  This is the name of the bundled project when it is finally built (sans the file extension, for
  example: <<<my-project-1.0.jar>>>). It defaults to <<<$\{artifactId\}-$\{version\}>>>. The term
  "finalName" is kind of a misnomer, however, as plugins that build the bundled project have every
  right to ignore/modify this name (but they usually do not). For example, if the <<<maven-jar-plugin>>>
  is configured to give a jar a <<<classifier>>> of <<<test>>>, then the actual jar defined above will
  be built as <<<my-project-1.0-test.jar>>>.

  * <<filter>>:
  Defines <<<*.properties>>> files that contain a list of properties that apply to resources which
  accept their settings (covered below). In other words, the "<<<name=value>>>" pairs defined within
  the filter files replace <<<$\{name\}>>> strings within resources on build. The example above defines
  the <<<filter1.properties>>> file under the <<<filters/>>> directory. Maven's default filter
  directory is <<<$\{basedir\}/src/main/filters/>>>.

  For a more comprehensive look at what filters are and what they can do, take a look at the
  {{{./guides/getting-started}quick start guide}}.

*** {Resources}

  Another feature of <<<build>>> elements is specifying where resources exist within your project.
  Resources are not (usually) code. They are not compiled, but are items meant to be
  bundled within your project or used for various other reasons, such as code generation.

  For example, a Plexus project requires a <<<configuration.xml>>> file (which specifies component
  configurations to the container) to live within the <<<META-INF/plexus>>> directory. Although we
  could just as easily place this file within <<<src/main/resources/META-INF/plexus>>>, we want
  instead to give Plexus its own directory of <<<src/main/plexus>>>. In order for the JAR plugin
  to bundle the resource correctly, you would specify resources similar to the following:

+------------------------------------------+
<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                      https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <build>
    ...
    <resources>
      <resource>
        <targetPath>META-INF/plexus</targetPath>
        <filtering>false</filtering>
        <directory>${basedir}/src/main/plexus</directory>
        <includes>
          <include>configuration.xml</include>
        </includes>
        <excludes>
          <exclude>**/*.properties</exclude>
        </excludes>
      </resource>
    </resources>
    <testResources>
      ...
    </testResources>
    ...
  </build>
</project>
+------------------------------------------+

  * <<resources>>:
  is a list of resource elements that each describe what and where to include files associated with this project.

  * <<targetPath>>:
  Specifies the directory structure to place the set of resources from a build. Target path defaults to the base
  directory. A commonly specified target path for resources that will be packaged in a JAR is META-INF.

  * <<filtering>>:
  is <<<true>>> or <<<false>>>, denoting if filtering is to be enabled for this resource. Note, that filter
  <<<*.properties>>> files do not have to be defined for filtering to occur - resources can also use properties
  that are by default defined in the POM (such as $\{project.version\}), passed into the command line using the
  "-D" flag (for example, "<<<-Dname>>>=<<<value>>>") or are explicitly defined by the properties element.
  Filter files were covered above.

  * <<directory>>:
  This element's value defines where the resources are to be found. The default directory for a build is
  <<<$\{basedir\}/src/main/resources>>>.

  * <<includes>>:
  A set of files patterns which specify the files to include as resources under that specified directory, using *
  as a wildcard.

  * <<excludes>>:
  The same structure as <<<includes>>>, but specifies which files to ignore. In conflicts between <<<include>>>
  and <<<exclude>>>, <<<exclude>>> wins.

  * <<testResources>>:
  The <<<testResources>>> element block contains <<<testResource>>>
  elements. Their definitions are similar to <<<resource>>> elements, but are naturally used during test
  phases. The one difference is that the default (Super POM defined) test resource directory for a project is
  <<<$\{basedir\}/src/test/resources>>>. Test resources are not deployed.

*** {Plugins}

+------------------------------------------+
<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                      https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <build>
    ...
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>2.6</version>
        <extensions>false</extensions>
        <inherited>true</inherited>
        <configuration>
          <classifier>test</classifier>
        </configuration>
        <dependencies>...</dependencies>
        <executions>...</executions>
      </plugin>
    </plugins>
  </build>
</project>
+------------------------------------------+

  Beyond the standard coordinate of <<<groupId:artifactId:version>>>, there are elements which
  configure the plugin or this builds interaction with it.

  * <<extensions>>:
  <<<true>>> or <<<false>>>, whether or not to load extensions of this plugin. It is by default false.
  Extensions are covered later in this document.

  * <<inherited>>:
  <<<true>>> or <<<false>>>, whether or not this plugin configuration should apply to POMs which inherit from this one.  Default value is <<<true>>>.

  * <<configuration>>:
  This is specific to the individual plugin. Without going too in depth into the mechanics of how plugins work,
  suffice it to say that whatever properties that the plugin Mojo may expect (these are getters and setters in
  the Java Mojo bean) can be specified here. In the above example, we are setting the classifier property to
  test in the <<<maven-jar-plugin>>>'s Mojo. It may be good to note that all configuration elements, wherever they
  are within the POM, are intended to pass values to another underlying system, such as a plugin. In other words:
  values within a <<<configuration>>> element are never explicitly required by the POM schema, but a plugin goal
  has every right to require configuration values.

  If your POM declares a parent, it inherits plugin configuration from either the
  <<build/plugins>> or <<pluginManagement>> sections of the parent.

  To illustrate, consider the following fragment from a parent POM:

+-----------------------------------------------+
<plugin>
<groupId>my.group</groupId>
<artifactId>my-plugin</artifactId>
<configuration>
  <items>
    <item>parent-1</item>
    <item>parent-2</item>
  </items>
  <properties>
    <parentKey>parent</parentKey>
  </properties>
</configuration>
</plugin>
+-----------------------------------------------+

  And consider the following plugin configuration from a project that uses that parent
  as its parent:

+-----------------------------------------------+
<plugin>
<groupId>my.group</groupId>
<artifactId>my-plugin</artifactId>
<configuration>
  <items>
    <item>child-1</item>
  </items>
  <properties>
    <childKey>child</childKey>
  </properties>
</configuration>
+-----------------------------------------------+

  The default behavior is to merge the content of the <<configuration>>
  element according to element name. If the child POM has a particular
  element, that value becomes the effective value. if the child POM
  does not have an element, but the parent does, the parent value
  becomes the effective value. Note that this is purely an operation on XML;
  no code or configuration of the plugin itself is involved. Only the
  elements, not their values, are involved.

  Applying those rules to the example, Maven comes up with:

+-----------------------------------------------+
<plugin>
<groupId>my.group</groupId>
<artifactId>my-plugin</artifactId>
<configuration>
  <items>
    <item>child-1</item>
  </items>
  <properties>
    <childKey>child</childKey>
    <parentKey>parent</parentKey>
  </properties>
</configuration>
+-----------------------------------------------+

  You can control how child POMs inherit configuration from parent POMs by adding attributes
  to the children of the <<configuration>> element. The attributes are <<<combine.children>>> and
  <<<combine.self>>>. Use these attributes in a child POM to control how Maven combines
  plugin configuration from the parent with the explicit configuration in the child.

  Here is the child configuration with illustrations of the two attributes:

+-----------------------------------------------+
<configuration>
  <items combine.children="append">
    <!-- combine.children="merge" is the default -->
    <item>child-1</item>
  </items>
  <properties combine.self="override">
    <!-- combine.self="merge" is the default -->
    <childKey>child</childKey>
  </properties>
</configuration>
+-----------------------------------------------+

  Now, the effective result is the following:

+-----------------------------------------------+
<configuration>
  <items combine.children="append">
    <item>parent-1</item>
    <item>parent-2</item>
    <item>child-1</item>
  </items>
  <properties combine.self="override">
    <childKey>child</childKey>
  </properties>
</configuration>
+-----------------------------------------------+

  <<combine.children="append">> results in the
  concatenation of parent and child elements, in that order.
  <<combine.self="override">>, on the other hand, completely
  suppresses parent configuration. You cannot use both
  <<combine.self="override">>
  and <<combine.children="append">> on an element; if you try,
  <override> will prevail.

  Note that these attributes only apply to the configuration element
  they are declared on, and are not propagated to nested elements. That
  is if the content of an <item> element from the child POM was a complex
  structure instead of text, its sub-elements would still be
  subject to the default merge strategy unless they were themselves
  marked with attributes.

  The combine.* attributes are inherited from parent to child POMs.
  Take care when adding those attributes to
  a parent POM as this might affect child or
  grand-child POMs.

  * <<dependencies>>:
  Dependencies are seen a lot within the POM, and are an element under all plugins element blocks.
  The dependencies have the same structure and function as under that base build.
  The major difference in this case is that instead of applying as dependencies of the project,
  they now apply as dependencies of the plugin that they are under. The power of this is to alter
  the dependency list of a plugin, perhaps by removing an unused runtime dependency via
  <<<exclusions>>>, or by altering the version of a required dependency. See above under <<Dependencies>>
  for more information.

  * <<executions>>:
  It is important to keep in mind that a plugin may have multiple goals. Each goal may have a separate
  configuration, possibly even binding a plugin's goal to a different phase altogether.
  <<<executions>>> configure the <<<execution>>> of a plugin's goals.

  For example, suppose you wanted to bind the <<<antrun:run>>> goal to the <<<verify>>> phase.
  We want the task to echo the build directory, as well as avoid passing on this configuration
  to its children (assuming it is a parent) by setting <<<inherited>>> to <<<false>>>.
  You would get an <<<execution>>> like this:

+------------------------------------------+
<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                      https://maven.apache.org/xsd/maven-4.0.0.xsd">
  ...
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-antrun-plugin</artifactId>
        <version>1.1</version>
        <executions>
          <execution>
            <id>echodir</id>
            <goals>
              <goal>run</goal>
            </goals>
            <phase>verify</phase>
            <inherited>false</inherited>
            <configuration>
              <tasks>
                <echo>Build Dir: ${project.build.directory}</echo>
              </tasks>
            </configuration>
          </execution>
        </executions>

      </plugin>
    </plugins>
  </build>
</project>
+------------------------------------------+

  * <<id>>:
  Self explanatory. It specifies this execution block between all of the others. When the phase is run,
  it will be shown in the form: <<<[plugin:goal {execution: id}]>>>. In the case of this example:
  <<<[antrun:run {execution: echodir}]>>>

  * <<goals>>:
  Like all pluralized POM elements, this contains a list of singular elements. In this case, a list
  of plugin <<<goals>>> which are being specified by this <<<execution>>> block.

  * <<phase>>:
  This is the phase that the list of goals will execute in. This is a very powerful option, allowing one to bind
  any goal to any phase in the build lifecycle, altering the default behavior of Maven.

  * <<inherited>>:
  Like the <<<inherited>>> element above, setting this to false will suppress Maven from passing this execution
  onto its children. This element is only meaningful to parent POMs.

  * <<configuration>>:
  Same as above, but confines the configuration to this specific list of goals, rather than all goals
  under the plugin.

*** {Plugin Management}

  * <<pluginManagement>>:
  is an element that is seen along side plugins. Plugin Management contains plugin elements in much
  the same way, except that rather than configuring plugin information for this particular project build,
  it is intended to configure project builds that inherit from this one. However, this only configures
  plugins that are actually referenced within the plugins element in the children or in the current POM.
  The children have every right to override <<<pluginManagement>>> definitions.

  []

+------------------------------------------+
<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                      https://maven.apache.org/xsd/maven-4.0.0.xsd">
  ...
  <build>
    ...
    <pluginManagement>
      <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-jar-plugin</artifactId>
          <version>2.6</version>
          <executions>
            <execution>
              <id>pre-process-classes</id>
              <phase>compile</phase>
              <goals>
                <goal>jar</goal>
              </goals>
              <configuration>
                <classifier>pre-process</classifier>
              </configuration>
            </execution>
          </executions>
        </plugin>
      </plugins>
    </pluginManagement>
    ...
  </build>
</project>
+------------------------------------------+

  If we added these specifications to the plugins element, they would apply only to a single POM.
  However, if we apply them under the <<<pluginManagement>>> element, then this POM <and all inheriting POMs>
  that add the <<<maven-jar-plugin>>> to the build will get the <<<pre-process-classes>>> execution as well.
  So rather than the above mess included in every child <<<pom.xml>>>, only the following is required:

+------------------------------------------+
<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                      https://maven.apache.org/xsd/maven-4.0.0.xsd">
  ...
  <build>
    ...
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
      </plugin>
    </plugins>
    ...
  </build>
</project>
+------------------------------------------+


** The {Build Element} Set

  The <<<Build>>> type in the XSD denotes those elements that are available only for the "project build". Despite
  the number of extra elements (six), there are really only two groups of elements that project build contains
  that are missing from the profile build: directories and extensions.

*** {Directories}

 The set of directory elements live in the parent build element, which set various directory structures
 for the POM as a whole. Since they do not exist in profile builds, these cannot be altered by profiles.

+------------------------------------------+
<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                      https://maven.apache.org/xsd/maven-4.0.0.xsd">
  ...
  <build>
    <sourceDirectory>${basedir}/src/main/java</sourceDirectory>
    <scriptSourceDirectory>${basedir}/src/main/scripts</scriptSourceDirectory>
    <testSourceDirectory>${basedir}/src/test/java</testSourceDirectory>
    <outputDirectory>${basedir}/target/classes</outputDirectory>
    <testOutputDirectory>${basedir}/target/test-classes</testOutputDirectory>
    ...
  </build>
</project>
+------------------------------------------+

  If the values of a <<<*Directory>>> element above is set as an absolute path (when their
  properties are expanded) then that directory is used. Otherwise, it is relative to the
  base build directory: <<<$\{basedir\}>>>. <<Please note that the>> <<<scriptSourceDirectory>>> <<is nowhere
  used in Maven and is obsolete>>.

*** {Extensions}

  Extensions are a list of artifacts that are to be used in this build. They will be included
  in the running build's classpath. They can enable extensions to the build process (such as add an
  ftp provider for the Wagon transport mechanism), as well as make plugins active which make changes
  to the build lifecycle. In short, extensions are artifacts that are activated during build. The
  extensions do not have to actually do anything nor contain a Mojo. For this reason, extensions
  are excellent for specifying one out of multiple implementations of a common plugin interface.

+------------------------------------------+
<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                      https://maven.apache.org/xsd/maven-4.0.0.xsd">
  ...
  <build>
    ...
    <extensions>
      <extension>
        <groupId>org.apache.maven.wagon</groupId>
        <artifactId>wagon-ftp</artifactId>
        <version>1.0-alpha-3</version>
      </extension>
    </extensions>
    ...
  </build>
</project>
+------------------------------------------+

* {Reporting}

  Reporting contains the elements that correspond specifically for the <<<site>>> generation phase.
  Certain Maven plugins can generate reports defined and configured under the reporting element,
  for example: generating Javadoc reports. Much like the build element's ability to configure plugins,
  reporting commands the same ability. The glaring difference is that rather than fine-grained control
  of plug-in goals within the executions block, reporting configures goals within <<<reportSet>>> elements.
  And the subtler difference is that a plugin <<<configuration>>> under the <<<reporting>>> element works as
  <<<build>>> plugin <<<configuration>>>, although the opposite is not true (a <<<build>>> plugin
  <<<configuration>>> does not affect a <<<reporting>>> plugin).

  Possibly the only item under the <<<reporting>>> element that would not be familiar to someone who
  understood the <<<build>>> element is the Boolean <<<excludeDefaults>>> element. This element
  signifies to the site generator to exclude reports normally generated by default. When a site is
  generated via the <<<site>>> build cycle, a <Project Info> section is placed in the left-hand menu,
  chock full of reports, such as the <<Project Team>> report or <<Dependencies>> list report. These report
  goals are generated by <<<maven-project-info-reports-plugin>>>. Being a plugin like any other, it may
  also be suppressed in the following, more verbose, way, which effectively turns off project-info reports.

+------------------------------------------+
<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                      https://maven.apache.org/xsd/maven-4.0.0.xsd">
  ...
  <reporting>
    <outputDirectory>${basedir}/target/site</outputDirectory>
    <plugins>
      <plugin>
        <artifactId>maven-project-info-reports-plugin</artifactId>
        <version>2.0.1</version>
        <reportSets>
          <reportSet></reportSet>
        </reportSets>
      </plugin>
    </plugins>
  </reporting>
  ...
</project>
+------------------------------------------+

  The other difference is the <<<outputDirectory>>> element under <<<plugin>>>. In the case of reporting,
  the output directory is <<<$\{basedir\}/target/site>>> by default.

** {Report Sets}

  It is important to keep in mind that an individual plugin may have multiple goals. Each goal may have a
  separate configuration. Report sets configure execution of a report plugin's goals. Does this sound familiar
  - deja-vu? The same thing was said about build's <<<execution>>> element with one difference: you cannot bind a
  report to another phase. Sorry.

  For example, suppose you wanted to configure the <<<javadoc:javadoc>>> goal to link to
  "{{http://java.sun.com/j2se/1.5.0/docs/api/}}", but only the <<<javadoc>>> goal (not the
  goal <<<maven-javadoc-plugin:jar>>>). We would also like this configuration passed to its
  children, and set <<<inherited>>> to true. The <<<reportSet>>> would resemble the following:

+------------------------------------------+
<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                      https://maven.apache.org/xsd/maven-4.0.0.xsd">
  ...
  <reporting>
    <plugins>
      <plugin>
        ...
        <reportSets>
          <reportSet>
            <id>sunlink</id>
            <reports>
              <report>javadoc</report>
            </reports>
            <inherited>true</inherited>
            <configuration>
              <links>
                <link>http://java.sun.com/j2se/1.5.0/docs/api/</link>
              </links>
            </configuration>
          </reportSet>
        </reportSets>
      </plugin>
    </plugins>
  </reporting>
  ...
</project>
+------------------------------------------+

  Between build <<<executions>>> and reporting <<<reportSets>>>, it should be clear now as to why they exist.
  In the simplest sense, they drill down in configuration. The POM must have a way not only to
  configure plugins, but they also must configure individual goals of those plugins. That is where these
  elements come in, giving the POM ultimate granularity in control of its build destiny.

{More Project Information}

  Although the above information is enough to get a firm grasp on POM authoring, there are far more
  elements to make developer's live easier. Many of these elements are related to site generation,
  but like all POM declarations, they may be used for anything, depending upon how certain plugins use
  it. The following are the simplest elements:

  * <<name>>:
  Projects tend to have conversational names, beyond the <<<artifactId>>>. The Sun engineers did not
  refer to their project as "java-1.5", but rather just called it "Tiger". Here is where to set that value.

  * <<description>>:
  Description of a project is always good. Although this should not replace formal documentation,
  a quick comment to any readers of the POM is always helpful.

  * <<url>>:
  The URL, like the name, is not required. This is a nice gesture for projects users, however, so
  that they know where the project lives.

  * <<inceptionYear>>:
  This is another good documentation point. It will at least help you remember where you have spent
  the last few years of your life.

* {Licenses}

+-------------------------+
<licenses>
  <license>
    <name>Apache License, Version 2.0</name>
    <url>https://www.apache.org/licenses/LICENSE-2.0.txt</url>
    <distribution>repo</distribution>
    <comments>A business-friendly OSS license</comments>
  </license>
</licenses>
+-------------------------+

  Licenses are legal documents defining how and when a project (or parts of a project) may be used.
  Note that a project should list only licenses that may apply directly to this project, and not list
  licenses that apply to this project's dependencies. Maven currently does little with these documents
  other than displays them on generated sites. However, there is talk of flexing for different types
  of licenses, forcing users to accept license agreements for certain types of (non open source)
  projects.

  * <<name>>, <<url>> and <<comments>>:
  are self explanatory, and have been encountered before in other capacities.
  Using an {{{https://spdx.org/licenses/}SPDX identifier}} as the license <<name>> is recommended.
  The fourth license element is:

  * <<distribution>>:
  This describes how the project may be legally distributed. The two stated methods are repo (they may be
  downloaded from a Maven repository) or manual (they must be manually installed).

* {Organization}

  Most projects are run by some sort of organization (business, private group, etc.). Here is
  where the most basic information is set.

+-------------------------+
<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                      https://maven.apache.org/xsd/maven-4.0.0.xsd">
  ...
  <organization>
    <name>Codehaus Mojo</name>
    <url>http://mojo.codehaus.org</url>
  </organization>
</project>
+-------------------------+

* {Developers}

  All projects consist of files that were created, at some time, by a person. Like the other systems
  that surround a project, so to do the people involved with a project have a stake in the project.
  Developers are presumably members of the project's core development.
  Note that, although an organization may have many
  developers (programmers) as members, it is not good form to list them all as developers, but
  only those who are immediately responsible for the code. A good rule of thumb is, if the person
  should not be contacted about the project, they do not need to be listed here.

+-------------------------+
<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                      https://maven.apache.org/xsd/maven-4.0.0.xsd">
  ...
  <developers>
    <developer>
      <id>jdoe</id>
      <name>John Doe</name>
      <email>jdoe@example.com</email>
      <url>http://www.example.com/jdoe</url>
      <organization>ACME</organization>
      <organizationUrl>http://www.example.com</organizationUrl>
      <roles>
        <role>architect</role>
        <role>developer</role>
      </roles>
      <timezone>America/New_York</timezone>
      <properties>
        <picUrl>http://www.example.com/jdoe/pic</picUrl>
      </properties>
    </developer>
  </developers>
  ...
</project>
+-------------------------+

  * <<id>>, <<name>>, <<email>>:
  These correspond to the developer's ID (presumably some unique ID across an organization), the
  developer's name and email address.

  * <<organization>>, <<organizationUrl>>:
  As you probably guessed, these are the developer's organization name and it's URL, respectively.

  * <<roles>>:
  A <<<role>>> should specify the standard actions that the person is responsible for. Like a single person
  can wear many hats, a single person can take on multiple <<<roles>>>.

  * <<timezone>>:
  A valid time zone ID like <<<America/New_York>>> or <<<Europe/Berlin>>>, or a numerical offset in hours
  (and fraction) from UTC where the developer lives, e.g., <<<-5>>> or <<<+1>>>. Time zone IDs are highly
  preferred because they are not affected by DST and time zone shifts. Refer to the
  {{{https://www.iana.org/time-zones}IANA}} for the official time zone database and a listing in
  {{{https://en.wikipedia.org/wiki/List_of_tz_database_time_zones}Wikipedia}}.

  * <<properties>>:
  This element is where any other properties about the person goes. For example, a link to a personal
  image or an instant messenger handle. Different plugins may use these properties, or they may simply
  be for other developers who read the POM.

* {Contributors}

  Contributors are like developers
  yet play an ancillary role in a project's lifecycle. Perhaps the contributor sent in a bug fix,
  or added some important documentation. A healthy open source project will likely have more contributors
  than developers.

+-------------------------+
<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                      https://maven.apache.org/xsd/maven-4.0.0.xsd">
  ...
  <contributors>
    <contributor>
      <name>Noelle</name>
      <email>some.name@gmail.com</email>
      <url>http://noellemarie.com</url>
      <organization>Noelle Marie</organization>
      <organizationUrl>http://noellemarie.com</organizationUrl>
      <roles>
        <role>tester</role>
      </roles>
      <timezone>America/Vancouver</timezone>
      <properties>
        <gtalk>some.name@gmail.com</gtalk>
      </properties>
    </contributor>
  </contributors>
  ...
</project>
+-------------------------+

  Contributors contain the same set of elements than developers sans the <<<id>>> element.

{Environment Settings}

* {Issue Management}

  This defines the defect tracking system (<Bugzilla>, <TestTrack>, <ClearQuest>, etc)
  used. Although there is nothing stopping a plugin from using this information for
  something, it's primarily used for generating project documentation.

+-------------------------+
<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                      https://maven.apache.org/xsd/maven-4.0.0.xsd">
  ...
  <issueManagement>
    <system>Bugzilla</system>
    <url>http://127.0.0.1/bugzilla/</url>
  </issueManagement>
  ...
</project>
+-------------------------+

* {Continuous Integration Management}

  Continuous integration build systems based upon triggers or timings (such as, hourly or daily)
  have grown in favor over manual builds in the past few years. As build systems have become more
  standardized, so have the systems that run the trigger those builds. Although the majority of the
  configuration is up to the specific program used (Continuum, Cruise Control, etc.), there are a few
  configurations which may take place within the POM. Maven has captured a few of the recurring
  settings within the set of notifier elements. A notifier is the manner in which people are notified
  of certain build statuses. In the following example, this POM is setting a notifier of type <<<mail>>>
  (meaning email), and configuring the email address to use on the specified triggers <<<sendOnError>>>,
  <<<sendOnFailure>>>, and not <<<sendOnSuccess>>> or <<<sendOnWarning>>>.

+-------------------------+
<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                      https://maven.apache.org/xsd/maven-4.0.0.xsd">
  ...
  <ciManagement>
    <system>continuum</system>
    <url>http://127.0.0.1:8080/continuum</url>
    <notifiers>
      <notifier>
        <type>mail</type>
        <sendOnError>true</sendOnError>
        <sendOnFailure>true</sendOnFailure>
        <sendOnSuccess>false</sendOnSuccess>
        <sendOnWarning>false</sendOnWarning>
        <configuration><address>continuum@127.0.0.1</address></configuration>
      </notifier>
    </notifiers>
  </ciManagement>
  ...
</project>
+-------------------------+

* {Mailing Lists}

  Mailing lists are a great tool for keeping in touch with people about a project.
  Most mailing lists are for developers and users.

+-------------------------+
<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                      https://maven.apache.org/xsd/maven-4.0.0.xsd">
  ...
  <mailingLists>
    <mailingList>
      <name>User List</name>
      <subscribe>user-subscribe@127.0.0.1</subscribe>
      <unsubscribe>user-unsubscribe@127.0.0.1</unsubscribe>
      <post>user@127.0.0.1</post>
      <archive>http://127.0.0.1/user/</archive>
      <otherArchives>
        <otherArchive>http://base.google.com/base/1/127.0.0.1</otherArchive>
      </otherArchives>
    </mailingList>
  </mailingLists>
  ...
</project>
+-------------------------+

  * <<subscribe>>, <<unsubscribe>>:
  There elements specify the email addresses which are used for performing the relative actions
  To subscribe to the user list above, a user would send an email to user-subscribe@127.0.0.1.

  * <<archive>>:
  This element specifies the url of the archive of old mailing list emails, if one exists.
  If there are mirrored archives, they can be specified under otherArchives.

  * <<post>>:
  The email address which one would use in order to post to the mailing list. Note that not all
  mailing lists have the ability to post to (such as a build failure list).

* {SCM}

  SCM (Software Configuration Management, also called Source Code/Control Management or, succinctly,
  version control) is an integral part of any healthy project. If your Maven project uses an SCM system
  (it does, doesn't it?) then here is where you would place that information into the POM.

+-------------------------+
<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                      https://maven.apache.org/xsd/maven-4.0.0.xsd">
  ...
  <scm>
    <connection>scm:svn:http://127.0.0.1/svn/my-project</connection>
    <developerConnection>scm:svn:https://127.0.0.1/svn/my-project</developerConnection>
    <tag>HEAD</tag>
    <url>http://127.0.0.1/websvn/my-project</url>
  </scm>
  ...
</project>
+-------------------------+

  * <<connection>>, <<developerConnection>>:
  The two connection elements convey to how one is to connect to the version control system
  through Maven. Where connection requires read access for Maven to be able to find the source
  code (for example, an update), developerConnection requires a connection that will give write
  access. The Maven project has spawned another project named
  Maven SCM, which creates a common API for any SCMs that wish to implement it. The most popular
  are CVS and Subversion, however, there is a growing list of other supported
  {{{/scm/scms-overview.html}SCMs}}. All SCM connections are made
  through a common URL structure.

-----------
scm:[provider]:[provider_specific]
-----------

  Where provider is the type of SCM system. For example, connecting to a CVS repository may look like this:

-----------
scm:cvs:pserver:127.0.0.1:/cvs/root:my-project
-----------

  * <<tag>>:
  Specifies the tag that this project lives under. HEAD (meaning, the SCM root) should be the default.

  * <<url>>:
  A publicly browsable repository. For example, via ViewCVS.

* {Prerequisites}

  The POM may have certain prerequisites in order to execute correctly.  For example,
  perhaps there was a fix in Maven 2.0.3 that you need in order to deploy using sftp.

  In Maven 3, use
  {{{/enforcer/enforcer-rules/requireMavenVersion.html} Maven Enforcer Plugin's <<<requireMavenVersion>>> rule}},
  or other rules to check other aspects.

  In Maven 2, here is where you give the prerequisites to building: if these are not met, Maven will
  fail the build before even starting. The only element that exists as a prerequisite in
  POM 4.0 is the <<<maven>>> element, which takes a minimum version number. It is checked with Maven 2, it is not any
  more in Maven 3.

+-------------------------+
<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                      https://maven.apache.org/xsd/maven-4.0.0.xsd">
  ...
  <prerequisites>
    <maven>2.0.6</maven>
  </prerequisites>
  ...
</project>
+-------------------------+

* {Repositories}

  Repositories are collections of artifacts which adhere to the Maven repository directory
  layout. In order to be a Maven repository artifact, a POM file must live within the structure
  <<<$BASE_REPO/groupId/artifactId/version/artifactId-version.pom>>>. <<<$BASE_REPO>>> can be
  local (file structure) or remote (base URL); the remaining layout will be the same. Repositories
  exist as a place to collect and store artifacts. Whenever a project has a dependency upon an
  artifact, Maven will first attempt to use a local copy of the specified artifact. If that artifact
  does not exist in the local repository, it will then attempt to download from a remote repository.
  The repository elements within a POM specify those alternate repositories to search.

  The repository is one of the most powerful features of the Maven community. By default Maven searches
  the central repository at {{https://repo.maven.apache.org/maven2/}}. Additional repositories can be 
  configured in the pom.xml `repositories` element. 

+-------------------------+
<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                      https://maven.apache.org/xsd/maven-4.0.0.xsd">
  ...
  <repositories>
    <repository>
      <releases>
        <enabled>false</enabled>
        <updatePolicy>always</updatePolicy>
        <checksumPolicy>warn</checksumPolicy>
      </releases>
      <snapshots>
        <enabled>true</enabled>
        <updatePolicy>never</updatePolicy>
        <checksumPolicy>fail</checksumPolicy>
      </snapshots>
      <name>Nexus Snapshots</name>
      <id>snapshots-repo</id>
      <url>https://oss.sonatype.org/content/repositories/snapshots</url>
      <layout>default</layout>
    </repository>
  </repositories>
  <pluginRepositories>
    ...
  </pluginRepositories>
  ...
</project>
+-------------------------+

  * <<releases>>, <<snapshots>>:
  These are the policies for each type of artifact, Release or snapshot. With these two sets, a POM
  has the power to alter the policies for each type independent of the other within a single repository.
  For example, one may decide to enable only snapshot downloads, possibly for development purposes.

  * <<enabled>>:
  <<<true>>> or <<<false>>> for whether this repository is enabled for the respective
  type (<<<releases>>> or <<<snapshots>>>).

  * <<updatePolicy>>:
  This element specifies how often updates should attempt to occur. Maven will compare the local
  POM's timestamp (stored in a repository's maven-metadata file) to the remote. The choices are:
  <<<always>>>, <<<daily>>> (default), <<<interval:X>>> (where X is an integer in minutes) or <<<never>>>.

  * <<checksumPolicy>>:
  When Maven deploys files to the repository, it also deploys corresponding checksum files. Your options
  are to <<<ignore>>>, <<<fail>>>, or <<<warn>>> on missing or incorrect checksums.

  * <<layout>>:
  In the above description of repositories, it was mentioned that they all follow a common layout. This
  is mostly correct. The layout introduced with Maven 2 is the default layout for repositories used by Maven both 2 & 3; however, Maven 1.x had a different
  layout. Use this element to specify which if it is <<<default>>> or <<<legacy>>>.

* {Plugin Repositories}

  Repositories are home to two major types of artifacts. The first are artifacts that are used as
  dependencies of other artifacts. These are the majority of artifacts that reside within central.
  The other type of artifact is plugins. Maven plugins are themselves a special type of artifact.
  Because of this, plugin repositories may be separated from other repositories (although, I have
  yet to hear a convincing argument for doing so). In any case, the structure of the <<<pluginRepositories>>>
  element block is similar to the <<<repositories>>> element. The <<<pluginRepository>>> elements each specify a
  remote location of where Maven can find new plugins.


* {Distribution Management}

  Distribution management acts precisely as it sounds: it manages the distribution of the artifact
  and supporting files generated throughout the build process. Starting with the last elements first:

+-------------------------+
<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                      https://maven.apache.org/xsd/maven-4.0.0.xsd">
  ...
  <distributionManagement>
    ...
    <downloadUrl>http://mojo.codehaus.org/my-project</downloadUrl>
    <status>deployed</status>
  </distributionManagement>
  ...
</project>
+-------------------------+

  * <<downloadUrl>>:
  is the URL of the repository which another POM can point to in order to grab this POM's
  artifact. In the simplest terms, we told the POM how to upload it (through repository/url),
  but from where can the public download it? This element answers that question.

  * <<status>>:
  Warning! Like a baby bird in a nest, the status should never be touched by human hands! The
  reason for this is that Maven will set the status of the project when it is transported out
  to the repository. Its valid types are as follows.

    * <<none>>:
    No special status. This is the default for a POM.

    * <<converted>>:
    The manager of the repository converted this POM from an earlier version to Maven 2.

    * <<partner>>:
    This artifact has been synchronized with a partner repository.

    * <<deployed>>:
    By far the most common status, meaning that this artifact was deployed from a Maven 2 or 3 instance. This is what you get when you manually deploy using the command-line deploy phase.

    * <<verified>>:
    This project has been verified, and should be considered finalized.


** {Repository}

  Whereas the repositories element specifies in the POM the location and manner in which Maven may
  download remote artifacts for use by the current project, distributionManagement specifies where
  (and how) this project will get to a remote repository when it is deployed.
  The repository elements will be used for snapshot distribution if the snapshotRepository is not defined.

+-------------------------+
<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                      https://maven.apache.org/xsd/maven-4.0.0.xsd">
  ...
  <distributionManagement>
    <repository>
      <uniqueVersion>false</uniqueVersion>
      <id>corp1</id>
      <name>Corporate Repository</name>
      <url>scp://repo/maven2</url>
      <layout>default</layout>
    </repository>
    <snapshotRepository>
      <uniqueVersion>true</uniqueVersion>
      <id>propSnap</id>
      <name>Propellors Snapshots</name>
      <url>sftp://propellers.net/maven</url>
      <layout>legacy</layout>
    </snapshotRepository>
    ...
  </distributionManagement>
  ...
</project>
+-------------------------+

  * <<id>>, <<name>>:
  The <<<id>>> is used to uniquely identify this repository amongst many, and the <<<name>>> is a human readable form.

  * <<uniqueVersion>>:
  The unique version takes a <<<true>>> or <<<false>>> value to denote whether artifacts deployed to this
  repository should get a uniquely generated version number, or use the version number defined as part of
  the address.

  * <<url>>:
  This is the core of the repository element. It specifies both the location and the transport protocol
  used to transfer a built artifact (and POM file, and checksum data) to the repository.

  * <<layout>>:
  These are the same types and purpose as the layout element defined in the repository element.
  They are <<<default>>> and <<<legacy>>>.

** {Site Distribution}

  More than distribution to the repositories, <<<distributionManagement>>> is responsible for defining
  how to deploy the project's site and documentation.

+-------------------------+
<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                      https://maven.apache.org/xsd/maven-4.0.0.xsd">
  ...
  <distributionManagement>
    ...
    <site>
      <id>mojo.website</id>
      <name>Mojo Website</name>
      <url>scp://beaver.codehaus.org/home/projects/mojo/public_html/</url>
    </site>
    ...
  </distributionManagement>
  ...
</project>
+-------------------------+

  * <<id>>, <<name>>, <<url>>:
  These elements are similar to their counterparts above in the <<<distributionManagement>>>
  <<<repository>>> element.

** {Relocation}

+-------------------------+
<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                      https://maven.apache.org/xsd/maven-4.0.0.xsd">
  ...
  <distributionManagement>
    ...
    <relocation>
      <groupId>org.apache</groupId>
      <artifactId>my-project</artifactId>
      <version>1.0</version>
      <message>We have moved the Project under Apache</message>
    </relocation>
    ...
  </distributionManagement>
  ...
</project>
+-------------------------+

  Projects are not static; they are living things (or dying things, as the case may be). A common
  thing that happens as projects grow, is that they are forced to move to more suitable
  quarters. For example, when your next wildly successful open source project moves under
  the Apache umbrella, it would be good to give users a heads-up that the project is
  being renamed to <<<org.apache:my-project:1.0>>>. Besides specifying the new address, it
  is also good form to provide a message explaining why.

* {Profiles}

  A new feature of the POM 4.0 is the ability of a project to change settings depending
  on the environment where it is being built. A <<<profile>>> element contains both an optional
  activation (a profile trigger) and the set of changes to be made to the POM if that profile has been
  activated. For example, a project built for a test environment may point to a different database than
  that of the final deployment. Or dependencies may be pulled from different repositories based upon
  the JDK version used. The elements of profiles are as follows:

+-------------------------+
<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                      https://maven.apache.org/xsd/maven-4.0.0.xsd">
  ...
  <profiles>
    <profile>
      <id>test</id>
      <activation>...</activation>
      <build>...</build>
      <modules>...</modules>
      <repositories>...</repositories>
      <pluginRepositories>...</pluginRepositories>
      <dependencies>...</dependencies>
      <reporting>...</reporting>
      <dependencyManagement>...</dependencyManagement>
      <distributionManagement>...</distributionManagement>
    </profile>
  </profiles>
</project>
+-------------------------+

** {Activation}

  Activations are the key of a profile. The power of a profile comes from its ability to modify the
  basic POM only under certain circumstances. Those circumstances are specified via an <<<activation>>> element.

+-------------------------+
<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                      https://maven.apache.org/xsd/maven-4.0.0.xsd">
  ...
  <profiles>
    <profile>
      <id>test</id>
      <activation>
        <activeByDefault>false</activeByDefault>
        <jdk>1.5</jdk>
        <os>
          <name>Windows XP</name>
          <family>Windows</family>
          <arch>x86</arch>
          <version>5.1.2600</version>
        </os>
        <property>
          <name>sparrow-type</name>
          <value>African</value>
        </property>
        <file>
          <exists>${basedir}/file2.properties</exists>
          <missing>${basedir}/file1.properties</missing>
        </file>
      </activation>
      ...
    </profile>
  </profiles>
</project>
+-------------------------+

  Before Maven 3.2.2 Activation occurs when one or more of the specified criteria have been met. When the first positive result is encountered, processing stops and the profile is marked as active.
  Since Maven 3.2.2 Activation occurs when all of the specified criteria have been met.

  * <<jdk>>:
  <<<activation>>> has a built in, Java-centric check in the <<<jdk>>> element. This will activate if the test
  is run under a jdk version number that matches the prefix given. In the above example, <<<1.5.0_06>>>
  will match. Ranges are also supported. See the {{{/enforcer/enforcer-rules/versionRanges.html} maven-enforcer-plugin}} for more details about supported ranges.

  * <<os>>:
  The <<<os>>> element can define some operating system specific properties shown above. See the maven-enforcer-plugins {{{https://maven.apache.org/enforcer/enforcer-rules/requireOS.html}RequireOS Rule}} for more details about OS values.

  * <<property>>:
  The <<<profile>>> will activate if Maven detects a property (a value which can be dereferenced within the POM by <<<$\{name\}>>>)
  of the corresponding <<<name=value>>> pair.

  * <<file>>:
  Finally, a given filename may activate the <<<profile>>> by the <<<existence>>> of a file, or if it
  is <<<missing>>>. <<NOTE>>: interpolation for this element is limited to <<<$\{basedir\}>>>, System properties and request properties.

  []

  The <<<activation>>> element is not the only way that a <<<profile>>> may be activated.
  The <<<settings.xml>>> file's <<<activeProfile>>> element may contain the profile's <<<id>>>. They may also be
  activated explicitly through the command line via a comma separated list after the <<<-P>>> flag (e.g. <<<-P codecoverage>>>).

  <To see which profile will activate in a certain build, use the> <<<maven-help-plugin>>>.

-------
mvn help:active-profiles
-------

** {The BaseBuild Element Set} <(revisited)>

  As mentioned above, the reason for the two types of build elements reside in the fact that it does
  not make sense for a profile to configure build directories or
  extensions as it does in the top level of the POM. Reguardless of in which environment the project
  is built, some values will remain constant, such as the directory structure of the source code.
  <If you find your project needing to keep two sets of code for different environments, it may be
  prudent to investigate refactoring the project into two or more separate projects.>

{Final}

  The Maven POM is big. However, its size is also a testament to its versatility. The ability
  to abstract all of the aspects of a project into a single artifact is powerful, to say the least.
  Gone are the days of dozens of disparate build scripts and scattered documentation concerning each
  individual project. Along with Maven's other stars that make up the Maven galaxy - a well defined
  build lifecycle, easy to write and maintain plugins, centralized repositories, system-wide and
  user-based configurations, as well as the increasing number of tools to make developers' jobs easier
  to maintain complex projects - the POM is the large, but bright, center.

======================

  Aspects of this guide were originally published in the
  {{{http://www.javaworld.com/javaworld/jw-05-2006/jw-0529-maven.html}Maven 2 Pom Demystified}}.
