X

Spring boot multi-module maven project example

Learn to create spring boot project having multiple modules. The parent project will work as container for base maven configurations. The child modules will be actual spring boot projects – inheriting the maven properties from parent project.

1. Spring boot maven parent 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). It’s pom.xml file consist the list of all modules as well as common dependencies and properties inherited by child projects.

As we are creating spring boot project, we will 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>

</project>

2. Child modules – ear, war, jar

The child modules can be any project and can be creating any packaging. We can create any kind of dependency between modules and bundle them together as well. It is very much individual’s requirement specific.

In out case, we are creating an ear file, a war file and a jar file. Jar file is bundled into war file, which is bundled into ear file. The ear file is final package to be deployed to 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 dependecies as per requirements.

2.1. jar package

<?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 package

<?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 package

<?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. Maven build

To compile and build all projects in single command, go to parent project and run ‘mvn clean install’ command. This command will generate us an ear file with name HelloWorldApp-1.0-SNAPSHOT.ear.

E:\HelloWorldApp>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 console
Multi-module maven project using eclipse

Categories: Spring Boot 2
Lokesh Gupta: @HowToDoInJAVAA family guy with fun loving nature. Love computers, programming and solving everyday problems. Find me on <a href="https://facebook.com/howtodoinjava" rel="external">Facebook</a> and <a href="https://twitter.com/howtodoinjava" rel="external">Twitter</a>.