Learn to create a spring boot project having multiple modules. The parent project will work as a container for base maven configurations.
The child modules will be actual spring boot projects – inheriting the maven properties from the parent project.
1. Parent Spring Boot Project
The parent project is single point to trigger build process for all the modules and optionally generate a deployable package (e.g., ear, war, etc.). The pom.xml file consists of the list of all modules and common dependencies and properties inherited by child projects.
As we are creating a spring boot project, we need to add spring-boot-starter-parent dependency. It is the parent POM providing dependency and plugin management for Spring Boot-based applications.
It contains the default versions of Java to use, the default versions of dependencies that Spring Boot uses, and the default configuration of the Maven plugins.
$ mvn archetype:generate -DgroupId=com.howtodoinjava
-DartifactId=HelloWorldApp
-DarchetypeArtifactId=maven-archetype-quickstart
-DinteractiveMode=false
<?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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.howtodoinjava</groupId>
<artifactId>HelloWorldApp</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<name>HelloWorldApp</name>
<url>http://maven.apache.org</url>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<modules>
<module>HelloWorldApp-ear</module>
<module>HelloWorldApp-service</module>
<module>HelloWorldApp-rws</module>
</modules>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
2. Child Projects – ear, war, jar
The child modules can be any project and can be creating any packaging. We can create any dependency between modules and bundle them together as well. It is very much individual’s requirement specific.
In our case, we are creating an ear file, a war file, and a jar file. The jar file is bundled into a war file, which is bundled into an ear file. The ear file is the final package to be deployed on application servers.
$ cd HelloWorldApp
$ mvn archetype:generate -DgroupId=com.howtodoinjava
-DartifactId=HelloWorldApp-ear
-DarchetypeArtifactId=maven-archetype-quickstart
-DinteractiveMode=false
$ mvn archetype:generate -DgroupId=com.howtodoinjava
-DartifactId=HelloWorldApp-service
-DarchetypeArtifactId=maven-archetype-quickstart
-DinteractiveMode=false
$ mvn archetype:generate -DgroupId=com.howtodoinjava
-DartifactId=HelloWorldApp-rws
-DarchetypeArtifactId=maven-archetype-webapp
-DinteractiveMode=false
Please add the 3rd-party libraries and dependencies as per requirements.
2.1. JAR Module
<?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.howtodoinjava</groupId>
<artifactId>HelloWorldApp</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>HelloWorldApp-service</artifactId>
<name>HelloWorldApp-service</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
</project>
2.2. WAR Module
<?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.howtodoinjava</groupId>
<artifactId>HelloWorldApp</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>HelloWorldApp-rws</artifactId>
<packaging>war</packaging>
<name>HelloWorldApp-rws Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Package jar in the war file -->
<dependency>
<groupId>com.howtodoinjava</groupId>
<artifactId>HelloWorldApp-service</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<finalName>HelloWorldApp-rws</finalName>
</build>
</project>
2.3. EAR Module
<?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.howtodoinjava</groupId>
<artifactId>HelloWorldApp</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>HelloWorldApp-ear</artifactId>
<name>HelloWorldApp-ear</name>
<url>http://maven.apache.org</url>
<packaging>ear</packaging>
<dependencies>
<!-- Package war in the ear file -->
<dependency>
<groupId>com.howtodoinjava</groupId>
<artifactId>HelloWorldApp-rws</artifactId>
<version>1.0-SNAPSHOT</version>
<type>war</type>
</dependency>
</dependencies>
<!-- Plugin to bundle the ear file-->
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-ear-plugin</artifactId>
<version>3.0.1</version>
<configuration>
<finalName>HelloWorldApp-${project.version}</finalName>
<modules>
<webModule>
<groupId>com.howtodoinjava</groupId>
<artifactId>HelloWorldApp-rws</artifactId>
<uri>HelloWorldApp-rws-1.0-SNAPSHOT.war</uri>
<!-- Set custom context root -->
<contextRoot>/application</contextRoot>
</webModule>
</modules>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
3. Building the Project
To compile and build all projects in a single command, go to parent project and run ‘mvn clean install
‘ command. This command will generate us an ear file with the name HelloWorldApp-1.0-SNAPSHOT.ear
.
$ mvn clean install
...
...
...
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO]
[INFO] HelloWorldApp 1.0-SNAPSHOT ......................... SUCCESS [ 0.428 s]
[INFO] HelloWorldApp-service .............................. SUCCESS [ 1.000 s]
[INFO] HelloWorldApp-rws Maven Webapp ..................... SUCCESS [ 1.322 s]
[INFO] HelloWorldApp-ear 1.0-SNAPSHOT ..................... SUCCESS [ 0.813 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 4.063 s
[INFO] Finished at: 2018-11-19T09:28:31+05:30
[INFO] ------------------------------------------------------------------------
Happy Learning !!
Read More:
Multi-module maven project using the console
Multi-module maven project using eclipse
Hi,
How can you manage version in the SpringBoot Multi Module Project ? If you change version in one of the module, then you need to update the other module that depends on the changed module? Specially, how do you handle the situation in the production environment ?
I was getting issue like “child module of pom.xml does not exist” in the command at POINT 2, with the below command
$ mvn archetype:generate -DgroupId=com.howtodoinjava
-DartifactId=HelloWorldApp-ear
-DarchetypeArtifactId=maven-archetype-quickstart
-DinteractiveMode=false
But it got resolved when I enveloped in the parent pom.xml by “”
How can i launch multi-module application?
When i use “mvn spring-boot:run” it gives me below error
[ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:2.2.0.RELEASE:run (default-cli) on project multi-module-library: Unable to find a suitable main class, please add a ‘mainClass’ property -> [Help 1]
However when i execute “mvn clean install” it works fine and all modules shows success. what am i missing something here?
After creating the parent project, it you try to create child project it will fail, so change parent project packaging to pom
Hi, can you elaborate more about spring container behavior in this structure. I have same requirement in my project where a child project bean is getting used in my parent project. Now I am unsure how to do such configuration so that same bean will be useful for both parent and child project. Let me know any more details required. and Thank you so much for this post, it really helps!