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
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!