In this post, we will see how to create a maven Multi-module project. Multi-module project structuring can be handy when we have to share a particular module between different projects. For instance, you can have different web-applications which are using same module for interacting with database.
We will develop a parent-project and three sub-modules projects (one model library and two web applications), where both web-applications will share the same model library.
Step 1 : Create Parent project
mvn archetype:generate -DgroupId=com.websystique.multimodule -DartifactId=parent-project
This command will create a new project with name ‘parent-project’ in your workspace.
Step 2 : Update pom.xml to declare it as parent project
Open pom.xml of above created parent-project and change the packaging to ‘pom’.
<packaging>pom</packaging>
/parent-project/pom.xml
<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>com.websystique.multimodule</groupId>
<artifactId>parent-project</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<name>parent-project</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
Step 3 : Create sub-modules
Via command line, navigate to the directory of parent-project, and fire following commands
cd parent-project mvn archetype:generate -DgroupId=com.websystique.multimodule -DartifactId=model-lib mvn archetype:generate -DgroupId=com.websystique.multimodule -DartifactId=webapp1 mvn archetype:generate -DgroupId=com.websystique.multimodule -DartifactId=webapp2
Now if you open the parent-project pom.xml, you will find all three modules being added in there.
<modules>
<module>model-lib</module>
<module>webapp1</module>
<module>webapp2</module>
</modules>
Also, in each sub-module’s pom.xml, a parent section being added.
<parent>
<groupId>com.websystique.multimodule</groupId>
<artifactId>parent-project</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
Step 4 : Update sub-modules pom.xml to produce appropriate output
In our case, model-lib is a libreary(jar), we will set its’s packaging to jar.
<packaging>jar</packaging>
On the other hand, webapp1 & webapp2 are intended to be WAR, so we need to changed their pom.xml to set the packaging to war.
<packaging>war</packaging>
Below are the final pom.xml of each sub-module and parent-project
/parent-project/model-lib/pom.xml
<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.websystique.multimodule</groupId>
<artifactId>parent-project</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<groupId>com.websystique.multimodule</groupId>
<artifactId>model-lib</artifactId>
<version>1.0-SNAPSHOT</version>
<name>model-lib</name>
<packaging>jar</packaging>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
/parent-project/webapp1/pom.xml
<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.websystique.multimodule</groupId>
<artifactId>parent-project</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<groupId>com.websystique.multimodule</groupId>
<artifactId>webapp1</artifactId>
<version>1.0-SNAPSHOT</version>
<name>webapp1</name>
<packaging>war</packaging>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
/parent-project/webapp2/pom.xml
<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.websystique.multimodule</groupId>
<artifactId>parent-project</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<groupId>com.websystique.multimodule</groupId>
<artifactId>webapp2</artifactId>
<version>1.0-SNAPSHOT</version>
<name>webapp2</name>
<packaging>war</packaging>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
And the parent-project pom.xml is
/parent-project/pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<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>com.websystique.multimodule</groupId>
<artifactId>parent-project</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<name>parent-project</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<modules>
<module>model-lib</module>
<module>webapp1</module>
<module>webapp2</module>
</modules>
</project>
Step 5 : Import these projects as ‘Existing maven projects’ in Eclipse
In Eclipse , File->Import->Maven->Existing maven projects

click next, select your workspace as root directory , you should see something similar :

click finish, you should see the projects got imported successfully in Eclipse.

Now when you build the parent-project, all your child project will be build successively.
One remark: Although it’s not mandatory, when you change any of your project, it’s advisable to perform a Maven-> Update project do get the changes reflected in all the projects which depends on this project.

That’s it.
References
If you like tutorials on this site, why not take a step further and connect me on Facebook , Google Plus & Twitter as well? I would love to hear your thoughts on these articles, it will help improve further our learning process.