1. 引言
傳統(tǒng)的web應(yīng)用,我們通常采用單一項(xiàng)目工程結(jié)構(gòu)。而到了分布式架構(gòu)系統(tǒng)中,尤其是微服務(wù)概念盛行的今天,這種項(xiàng)目結(jié)構(gòu)早已滿足不了我們的要求。比如設(shè)計(jì)一個(gè)互聯(lián)網(wǎng)電商微服務(wù)架構(gòu)系統(tǒng),往往會(huì)被拆分成多個(gè)微服務(wù)子系統(tǒng),如前端、支付、物流、訂單和庫存,各個(gè)子系統(tǒng)獨(dú)立部署,通過http調(diào)用,減少耦合。
本文將探索如何使用IntelliJ IDEA基于Maven創(chuàng)建多模塊項(xiàng)目。本項(xiàng)目也是后續(xù)SpringBoot如何快速集成第三方技術(shù)系列文章的開端項(xiàng)目,源碼將發(fā)布于github上,歡迎持續(xù)關(guān)注。
2. 項(xiàng)目結(jié)構(gòu)
這次我們搭建的多模塊項(xiàng)目主要包含
- springboot-commen?? 公共服務(wù)模塊
- springboot-swagger? Springboot集成Swagger技術(shù)模塊
- springboot-mybatis ? Springboot集成Mybatis技術(shù)模塊
公共服務(wù)組件主要存放一些通用的服務(wù)組件,后續(xù)其它第三方技術(shù)系列文章的工程也將在該項(xiàng)目中以新增模塊發(fā)布。
3. 搭建部署步驟
3.1 創(chuàng)建聚合工程parent
對(duì)于這些模塊,我們需要聚合parent maven項(xiàng)目,統(tǒng)一管理他們,下面就來創(chuàng)建一個(gè)parent項(xiàng)目。
選擇新建的項(xiàng)目類型為Spring Initializr,快速創(chuàng)建Springboot項(xiàng)目。

根據(jù)實(shí)際要求,設(shè)置項(xiàng)目屬性。后面Next直接使用默認(rèn)選項(xiàng),關(guān)于導(dǎo)入其他依賴包,我們手動(dòng)導(dǎo)入。

由于springboot-tech為聚合管理工程,并不需要src目錄,可以直接刪除,然后修改聚合工程springboot-tech的pom文件。
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- 項(xiàng)目說明:這里作為聚合工程的父工程,修改打包為pom聚合工程 -->
<groupId>com.qinghaihu</groupId>
<artifactId>sprinboot-tech</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<name>sprinboot-tech</name>
<description>Demo project for Spring Boot Technology</description>
<!-- 繼承說明:這里繼承SpringBoot提供的父工程 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<!-- 版本說明:這里統(tǒng)一管理依賴的版本號(hào),為了各個(gè)子module依賴包的一致性,避免版本不一致導(dǎo)致沖突問題 -->
<properties>
<java.version>1.8</java.version>
</properties>
<!--依賴說明:公共的maven庫在這里添加,每個(gè)工程獨(dú)有的maven包,在各個(gè)子工程添加,但是版本號(hào)都是在父工程統(tǒng)一配置-->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<!-- 注意: 因?yàn)槲覀儾恍枰猻pringboot-tech是一個(gè)可運(yùn)行的項(xiàng)目,所以修改原來的打包方式為maven打包方式 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
parent項(xiàng)目建立完畢,下面在此項(xiàng)目下新建我們需要的模塊,
3.2 添加子模塊項(xiàng)目
這里需要注意一下,如果想要建立對(duì)應(yīng)項(xiàng)目下的module項(xiàng)目,那么鼠標(biāo)先選中該項(xiàng)目名稱(對(duì)照上圖)在選擇File>>new>>Module,因?yàn)樗械膎ew都是相對(duì)你選中的目錄來的。


同樣的方法,新建剩余的其它模塊,新建完成后的目錄結(jié)構(gòu)如下圖。

3.3 建立模塊關(guān)系
接下來,首先建立相互關(guān)系,parent項(xiàng)目springboot-tech pom文件中配置子模塊,添加modules標(biāo)簽.
<modules>
<module>springboot-common</module>
<module>springboot-swagger</module>
<module>springboot-mybatis</module>
</modules>
修改子模塊pom文件,繼承于父模塊。添加子模塊的其它jar包依賴,也可依賴公共服務(wù)模塊,子模塊個(gè)性化配置。以springboot-swagger子模塊為例:
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!--<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.5.RELEASE</version>
<relativePath/>
</parent>
-->
<!--繼承父模塊parent工程-->
<parent>
<groupId>com.qinghaihu</groupId>
<artifactId>sprinboot-tech</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.qinghaihu</groupId>
<artifactId>springboot-swagger</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot-swagger</name>
<description>Demo project for Spring Boot Swagger</description>
<properties>
<!-- maven可以繼承父項(xiàng)目中的參數(shù),所以可以刪除子模塊中定義 -->
<!--<java.version>1.8</java.version>-->
</properties>
<dependencies>
<!--maven可以繼承父項(xiàng)目中的依賴,所以可以刪除子模塊中定義 -->
<!--
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
-->
<!--依賴公共服務(wù)模塊-->
<dependency>
<groupId>com.qinghaihu</groupId>
<artifactId>springboot-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.6.1</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.6.1</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.4</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
3.4 打包發(fā)布
在 maven project側(cè)邊欄中,先點(diǎn)擊parent項(xiàng)目的clean,然后點(diǎn)擊package或install進(jìn)行打包或發(fā)布。
