blob: dbf0e2c2bb8c19f406e4131cf111a4549451f35f [file] [log] [blame]
~~ 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.
-----
Inheritance in Maven
-----
The Maven Team
-----
Inheritance in Maven
In order the understand how inheritance works in Maven there are a few notions that you must be familiar with:
* The maven super model
* how parent poms are processed
* the order in which elements in the POM are overridden
* minimum element-set for a valid project pom
Maven super model
Inheritance is recursive in Maven but there is a special model which is the implicit super parent in the lineage
of models you may specify:
all of the models that you specify are collected to produce a lineage and then the super model is place at
the top of that lineage to provide default values.
The super model is where we place all the values which we believe to be standard, values that can be shared and
utilized across all your maven projects.
+-----+
m0 <- m1 <- m2
+-----+
which is transformed into
+-----+
super model <- m0 <- m1 <- m2
+-----+
+-----+
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
</parent>
</project>
+-----+
Extending the POM in the future
In order to anticipate changes in the structure of the POM as new releases of
maven occur, the maven inheritance model must be pinned against a particular
modelVersion. This is required so that a change from modelVersion 4.0.0 to
4.1.0 doesn't cause compatibility problems with users who have not upgraded
their projects. It also allows for a certain amount of legacy support into the
future. Therefore, we should rename this file from pom.xml in the maven-core
jarfile to pom-4.0.0.xml (and successive revisions to the base pom made to
accommodate changes in the model will be named accordingly - 4.0.1, 4.0.2, ...).
Minimum Element-Set for a Project POM
In order to furnish a basic set of information which we need to distinguish one
project from another, maven requires a minimum set of elements to be specified
in each project's pom.xml.
- [modelVersion] tells maven which version of the object model this project
is compliant with (to support future legacy concerns)
- [artifactId] tells maven what the artifact name is for this particular
project. Each project should have a distinct artifactId.
- [version] tells maven what release of this artifact we're trying to produce.
The fact that a project has a distinct pom.xml should indicate a separate
release cycle that is also distinct to that project, so a concrete version
declaration is required.
- [name] tells maven what the user-friendly name of this project is. The name
element is similar to artifactId in that it is a unique descriptor for
this and only this project, and therefore should be concretely defined.