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