Multi Module Inheritance
The previous tutorials explained the structure of simple and hierarchical multi module project. This tutorial explain the use of inheritance feature to compact and streamline the module POMs.
The example code
extended-multi, used in this tutorial, is available
at GitHub Maven Examples. Download the examples as zip and extract it to some location or clone it with git.
Most elements from the parent POM are inherited by its children. Out of these, properties and dependencies comes handy in multi module projects. Let’s see how we can use them.
In extend-multi project, we set sourceEncoding property in multiple POM.
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties>
and remove the properties block.
Similarly, junit dependency is specified in multiple locations
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency>
and remove the junit dependency.
mvn test from the top level folder and as expected, Maven
build fails because of missing junit library. It also displays a warning
that build is platform dependent as sourceEncoding is not
<a href="https://maven.apache.org/pom.html#Inheritance" target="_blank">WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
To overcome these errors, modify top-level POM i.e.
extended-multi/pom.xml and add properties and junit dependency to it.
The file content after modification is as
<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.codetab</groupId> <artifactId>extended-multi</artifactId> <version>1.0</version> <packaging>pom</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> </dependencies> <modules> <module>app</module> <module>shared</module> </modules> </project>
mvn test and project builds successfully without any
To summarize, we removed properties and junit dependency from all the module pom.xml and moved it to top level pom.xml. Because of inheritance, all child pom.xml inherits these items from parent.
However, be extra careful while adding the dependencies to the top-level pom.xml as they are inherited by all child POM. Add only those dependencies which are required by each and every module. Good examples of such libraries are JUnit, Log4j or Sl4j etc., and these are normally required by all modules.
When a dependency is required by some or even many, but not by all the modules, then use dependency management feature.
For list of inherited and not inherited elements, refer [POM Reference