A multi-module project is defined by a parent POM referencing one or more submodules. In the simple-parent/ directory, you will find the parent POM (also called the top-level POM) in simple-parent/pom.xml. See simple-parent Project 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
http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.sonatype.mavenbook.multi</groupId>
<artifactId>simple-parent</artifactId>
<packaging>pom</packaging>
<version>1.0</version>
<name>Multi Chapter Simple Parent Project</name>
<modules>
<module>simple-weather</module>
<module>simple-webapp</module>
</modules>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
Notice that the parent defines a set of Maven coordinates: the
groupId is org., the sonatype.mavenbook.multiartifactId is
simple-parent, and the version is 1.0. The parent project
doesn’t create a JAR or a WAR like our previous projects; instead, it
is simply a POM that refers to other Maven projects. The appropriate
packaging for a project like simple-parent that simply provides a
Project Object Model is pom. The next section in the pom.xml lists
the project’s submodules. These modules are defined in the modules
element, and each module element corresponds to a subdirectory of the
simple-parent/ directory. Maven knows to look in these directories
for pom.xml files, and it will add submodules to the list of Maven
projects included in a build.
Lastly, we define some settings which will be inherited by all
submodules. The simple-parent build configuration configures the
target for all Java compilation to be the Java 5 JVM. Since the
compiler plugin is bound to the lifecycle by default, we can use the
pluginManagement section do to this. We will discuss pluginManagement
in more detail in later chapters, but the separation between providing
configuration to default plugins and actually binding plugins is much
easier to see when they are separated this way. The dependencies
element adds JUnit 3.8.1 as a global dependency. Both the build
configuration and the dependencies are inherited by all
submodules. Using POM inheritance allows you to add common
dependencies for universal dependencies like JUnit or Log4J.