Maven Parent and Child POM Example

Maven parent POM (or super POM) is used to structure the project to avoid redundancies or duplicate configurations using inheritance between pom files.

Java Build Path of Child Project

Maven parent POM (or super POM) is used to structure the project to avoid redundancies or duplicate configurations using inheritance between pom files. It helps in easy maintenance in long term.

Note that if any dependency or property is configured in both parent and child POMs with different values then the child POM value will take priority.

1. Contents of Parent POM

A parent POM can be declared with packaging pom. It is not meant to be distributed because it is only referenced from other projects.

Maven parent pom can contain almost everything, and those can be inherited into child pom files e.g

  • Common data – Developers’ names, SCM address, distribution management etc.
  • Constants – Such as version numbers
  • Common dependencies – Common to all children. It has the same effect as writing them several times in individual pom files.
  • Properties – For example plugins, declarations, executions and IDs.
  • Configurations
  • Resources

2. A simple Example of Parent POM and Child POM

To match a parent POM, Maven uses two rules:

  • There is a pom file in the project’s root directory or in a given relative path.
  • Reference from the child POM file contains the same coordinates as stated in the parent POM file.

2.1. Parent POM

In the following example, parent POM has configured basic project information and two dependencies for JUnit and spring framework.

<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>com.howtodoinjava.demo</groupId>
  <artifactId>MavenExamples</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>pom</packaging>
 
  <name>MavenExamples Parent</name>
  <url>http://maven.apache.org</url>
 
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <junit.version>3.8.1</junit.version>
    <spring.version>4.3.5.RELEASE</spring.version>
  </properties>
 
  <dependencies>
   
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>${junit.version}</version>
      <scope>test</scope>
    </dependency>
     
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>${spring.version}</version>
    </dependency>
     
  </dependencies>
</project>

2.2. Child POM

Now child POM needs to refer to the parent POM using the parent tag and specifying groupId/artifactId/version attributes. This pom file will inherit all properties and dependencies from the parent POM and can also include extra sub-project-specific 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">
 
  <!--The identifier of the parent POM-->
  <parent>
    <groupId>com.howtodoinjava.demo</groupId>
    <artifactId>MavenExamples</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
 
  <modelVersion>4.0.0</modelVersion>
  <artifactId>MavenExamples</artifactId>
  <name>MavenExamples Child POM</name>
  <packaging>jar</packaging>
 
  <dependencies>    
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-security</artifactId>
      <version>${spring.version}</version>
    </dependency>
  </dependencies>
 
</project>

3. Relative Path to Parent

By default, Maven looks for the parent POM first at the project’s root, then the local repository, and lastly in the remote repository. If the parent POM file is not located in any other place, then you can use the code tag. This relative path shall be relative to project root.

The relative path, if not given explicitly, defaults to .., i.e. the pom in the parent directory of the current project.

<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">
 
  <!--The identifier of the parent POM-->
  <parent>
    <groupId>com.howtodoinjava.demo</groupId>
    <artifactId>MavenExamples</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <relativePath>../baseapp/pom.xml</relativePath>
  </parent>
 
  <modelVersion>4.0.0</modelVersion>
  <artifactId>MavenExamples</artifactId>
  <name>MavenExamples Child POM</name>
  <packaging>jar</packaging>
 
</project>

4. Demo

Let’s learn to create maven projects with the parent-child relationships.

4.1. Create Parent Project

Project creation wizard.

Create Maven Project Wizard
Create Maven Project Wizard

Select Project Archetype.

Maven Quick Start Archtype
Maven Quick Start Archetype

Fill in the details and create a project.

Create Maven Parent Project
Create Maven Parent Project

Now change packaging from jar to pom in pom.xml.

<packaging>jar</packaging> //previous
 
<packaging>pom</packaging> //New

Additionally, add project properties and dependencies.

<properties>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  <junit.version>3.8.1</junit.version>
  <spring.version>4.2.3.RELEASE</spring.version>
</properties>
 
<dependencies>
  <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>${junit.version}</version>
    <scope>test</scope>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>${spring.version}</version>
  </dependency>
</dependencies>

4.2. Create Child Project

Create a new maven project just like you did for the parent project. Change project-specific details like its name etc.

Create Maven Child Project
Create Maven Child Project

Now update the child project’s pom.xml file with parent reference.

<!--The identifier of the parent POM -->
<parent>
  <groupId>com.howtodoinjava.demo</groupId>
  <artifactId>MavenExamples</artifactId>
  <version>0.0.1-SNAPSHOT</version>
</parent>

Now you are free to use parent pom’s elements such as properties. Your child project has inherited the parent project. To test this, just remove all dependencies from child project’s pom.xml.

Now check its libraries in Java Build Path. You will see all parent’s dependencies there.

Java Build Path of Child Project
Java Build Path of Child Project

Drop me your questions in the comment section.

Happy Learning !!

Ref: Maven Inheritance

Leave a Comment

  1. I tried this, but during compilation, Maven search the PARENT remotely…

    [ERROR] Failed to execute goal on project GraphClientPropietary: Could not resolve dependencies for project com.graphclient.propietary: GraphClientPropietary:war:1.0-SNAPSHOT: Could not transfer artifact com.graphclient:GraphClient:jar:1.
    0-SNAPSHOT from/to central1 (https://mvnrepository.com/artifact): authorization failed for https://mvnrepository.com/artifact/com/graphclient/ GraphClient/1.0-SNAPSHOT/GraphClient-1.0-SNAPSHOT.jar, status: 403 Forbidden -> [Help 1]

    How can I solve it?

    Reply
  2. Parent common dependency jars are available in child under lib folder and it is. working in STS/ ECLIPSE/RAD/ or IDE.But when same used do mvn clean install, manifest file dependency jars are not appended. Due to this we are getting run time error class not found

    Reply
  3. Hi, I have a Parent and Child POM which I stored in my personal GitHub, they both work as intended, but only if I build them sepparatelly in my machine, building the Child alone doesn’t build the parent POM and the jar, class and pom files of the parent do not get created. I have created a release in GitHub to which I attached the POM and JAR files of the parent but no luck, I also tried to use JitPack with the GitHub release, but same as before…the mvn install and mvn build instructions failed to find the files of the parent.

    Here’s my personal Git repo for reference: https://github.com/omarjmc

    Reply
  4. In general yes, but you shouldn’t place property in it suppose to be fixed. The correct approach is to use rpropertiest in dependecies, plugin configuration etc.

    Reply
  5. I have a parent pom in which i have defined a properties

     
    <project>
         <modelVersion>4.0.0</modelVersion>
         <groupId>com.mycompany.app</groupId>
         <artifactId>my-module</artifactId>
         <version>${artifact.version}</version>
    .....
    .....
    <properties>
                <artifact.version>1.12.0</artifact.version>
    </properties>
    </project>
    

    I have multiple modules in my workspace, so to keep version in one place, I have done above changes.

    Now in all my child modules defining the parent tag as below.

    <parent>
         <groupId>com.mycompany.app</groupId>
          <artifactId>my-module-child</artifactId>
          <version>${artifact.version}</version>
         <relativePath>../my-module/pom.xml</relativePath>
    </parent>
    

    Please suggest if this is correct approach to use the relative path or there are any issue with above code.

    Reply
  6. I am trying to reference classes of child module from the parent module and it is giving error that class not found. Also, when compiling though mvn compile the parent project, it doesn’t compile the module. Even after entering garbage chars, compile is getting passed for parent project. Please help.

    Reply
  7. Hello,

    If you have such an example and you try to do a mvn release:prepare release:perform , it will cruch :

    The version could not be updated: ${spring.version} …

    Can you please advise ?

    Thank you in advance!

    Reply
    • Yes. Follow these steps:

      1) Create parent maven project. Set packaging to pom.
      2) Create any maven project and add parent tag.
      3) You should be able to use parent pom’s properties.

      Reply

Leave a Comment

About Us

HowToDoInJava provides tutorials and how-to guides on Java and related technologies.

It also shares the best practices, algorithms & solutions and frequently asked interview questions.