SpringBoot圖文教程16—SpringBoot 多模組開發「web」「打包」
- 2020 年 3 月 30 日
- 筆記
本文已經收錄碼雲倉庫:https://gitee.com/bingqilinpeishenme/Java-Tutorials 本文涉及源碼下載地址:https://gitee.com/bingqilinpeishenme/multi-module-demo

什麼是多模組開發?如圖所示,項目中每一個包對應都是一個完整的項目,在IDEA中稱之為模組,每一個模組都有完整的項目結構:獨立的pom文件,獨立的配置文件,獨立的編譯文件輸出模組等等。
那麼這樣項目結構的項目是如何設計出來的呢?

SpringBoot 多模組開發
技術選型:
- SpringBoot
- MybatisPlus MybatisPlus教程見:SpringBoot圖文教程11—從此不寫mapper文件「SpringBoot集成MybatisPlus」
- Mysql 多模組開發效果圖如下:

父級工程開發

父級工程可以用來統一管理所有項目的依賴,如圖,如果在父級項目中有一個mysql依賴,那麼所有繼承這個父級項目的子項目中也會繼承到mysql的依賴
1.創建一個Project




2.對IDEA做一些項目基本的配置
- 字元編碼配置

- 註解生效激活

- Java編譯版本選擇

3.寫父級項目的pom文件
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 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <!-- 配置SpringBoot的父級項目--> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.3.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.lby</groupId> <artifactId>multi-module-demo</artifactId> <version>1.0-SNAPSHOT</version> <!-- packaging 父級項目的類型是pom --> <packaging>pom</packaging> <!-- properties 定義pom的全局變數 一般用於定義依賴的版本號 --> <properties> <java.version>1.8</java.version> <!-- lombok-version 這個標籤是自定義的可以隨便寫 本質上就是一個變數 --> <lombok-version>1.18.4</lombok-version> </properties> <dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <!-- 版本號通過$獲取properties中定義的版本號--> <version>${lombok-version}</version> <scope>provided</scope> </dependency> </dependencies> <!-- dependencyManagement 在 dependencyManagement 中配置的依賴 只是一種聲明 聲明了版本號 不會被項目繼承下來【相關的jar包不會被子項目下載到項目中】 子項目如果想要繼承到dependencyManagement中的依賴 需要單獨在配置 只不過子項目如果繼承 dependencyManagement 中的依賴 可以不寫版本號【子項目中依賴版本 按照父項目中dependencyManagement 中配置下載】 --> <dependencyManagement> <dependencies> <!--如果是Mybatis寫成Mybatis即可--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.3.1.tmp</version> </dependency> <!--數據源--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.19</version> </dependency> <!--mysql--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.38</version> </dependency> </dependencies> </dependencyManagement> </project> 注意:
- 父級項目的packing必須設置為 pom
- dependencies 和 DependencyManagement 的區別
- 如果在子項目中聲明依賴,是不會從父項目中繼承下來的,只有在子項目中寫了該依賴項,並且沒有執行具體版本,才會從父項目中繼承該項,並且version和scope都讀取自父pom
- 如果子項目指定了版本號,那麼會使用子項目中指定的jar版本
- dependencies 在當前項目中引入依賴,如果子項目繼承了該項目,也會在子項目中引入依賴
- DependencyManagement 只是聲明依賴,並不實際引入,因此子項目需要顯式聲明需要用到的依賴
子項目開發
子項目開發的步驟如下:
- 基於Project創建module
- 修改pom
- 寫配置,沒有可以不寫
- 寫程式碼
1.創建multi-entity
1.基於Project創建module

創建完multi-entity後打開pom可以看到

此時打開父級項目的pom 會看到

2.修改pom
完整的multi-entity項目的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 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <!-- 子項目繼承父項目的配置 parent --> <parent> <artifactId>multi-module-demo</artifactId> <groupId>com.lby</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>multi-entity</artifactId> <dependencies> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> </dependency> </dependencies> </project>
3.在項目中寫入實體類
package com.lby.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; @TableName("cmfz_admin") @Data public class Admin { /** * 主鍵屬性 @TableId * * value 該屬性對應的資料庫表中的欄位名 * type 主鍵自增的類型 AUTO 代表自動遞增 */ @TableId(value = "id",type = IdType.AUTO) private Integer id; /** * 非主鍵屬性 @TableField * @TableField("username") 參數為該屬性對應的資料庫表中的欄位名 * */ private String username; private String password; private String salt; } 2.按照上述步驟創建 multi-dao
對於dao模組而言,不同的地方在於,在multi-dao中需要使用到 multi-entity中的實體類,但是怎麼在dao模組中使用到另一個項目中的實體類呢?
將multi-entity像依賴一樣導入 multi-dao中

multi-dao完整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 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>multi-module-demo</artifactId> <groupId>com.lby</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>multi-dao</artifactId> <dependencies> <!-- 在dao中引用entity 可以在dao的程式碼中直接導入entity中的類和方法 --> <dependency> <groupId>com.lby</groupId> <artifactId>multi-entity</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <!-- 如果配置依賴在父項目的 dependencyManagement 有--> <!-- 可以不寫版本號 版本號繼承父項目中的--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> </dependency> </dependencies> </project>
在multi-dao寫入dao介面
package com.lby.dao; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.lby.entity.Admin; public interface AdminDao extends BaseMapper<Admin> { } 3.創建 multi-service 模組
完整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 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>multi-module-demo</artifactId> <groupId>com.lby</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>multi-service</artifactId> <dependencies> <!-- multi-service中需要引入 dao模組--> <dependency> <groupId>com.lby</groupId> <artifactId>multi-dao</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies> </project>
寫入業務類
package com.lby.service; import com.lby.dao.AdminDao; import com.lby.entity.Admin; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; /** * 之所以能夠直接使用@Service註解 * 是因為 multi-service 模組 依賴了 multi-dao * multi-dao 依賴了 multi-entity * multi-entity 中的 MybatisPlus 依賴在項目中導入了Spring的jar包 */ @Service public class AdminService { @Autowired private AdminDao adminDao; public List<Admin> adminList(){ return adminDao.selectList(null); } } 4.創建 multi-controller 模組
multi-controller 模組是啟動類所在的模組 所以我們把配置文件 啟動類以及SpringBoot集成maven的插件都放在這個項目中
1.完整的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 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>multi-module-demo</artifactId> <groupId>com.lby</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>multi-controller</artifactId> <dependencies> <!-- controller中需要引入service--> <dependency> <groupId>com.lby</groupId> <artifactId>multi-service</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <!-- web--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--測試--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <!-- spring-boot-maven-plugin 插件配置在啟動類所在的模組--> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
2.application配置文件配置
#配置埠號 server: port: 8802 #數據源的配置 spring: datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/cmfz?useUnicode=true&characterEncoding=UTF-8 username: root password: 123456 type: com.alibaba.druid.pool.DruidDataSource #mybatis-plus mybatis-plus: mapper-locations: classpath:mapper/*Mapper.xml # root 全局日誌等級 默認是info 可以修改 debug warn error logging: level: root: info com.baizhi: debug
3.啟動類程式碼
package com.lby; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @MapperScan("com.lby.dao") @SpringBootApplication public class AppRun { public static void main(String[] args) { SpringApplication.run(AppRun.class,args); } } 4.controller程式碼
package com.lby.controller; import com.lby.entity.Admin; import com.lby.service.AdminService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; @RestController public class AdminController { @Autowired private AdminService adminService; @RequestMapping("adminList") public List<Admin> adminList(){ return adminService.adminList(); } } 5.啟動項目
通過啟動類啟動項目

訪問地址:http://localhost:8802/adminList 可以看到如下效果

如果要使用插件啟動 需要先對父項目進行 clean 和 install操作


6.測試
編寫測試類

運行測試方法 效果如下

7.打包項目
注意:啟動類在哪個模組,就通過哪個模組打包
通過maven打包項目

找到打包好的項目 通過java -jar運行項目

訪問地址:http://localhost:8802/adminList 可以看到如下效果

常見問題處理
1.循環依賴問題

image.png
錯誤資訊提示:
Error:java: Annotation processing is not supported for module cycles. Please ensure that all modules from cycle [qrcode-common,qrcode-manager-pojo] are excluded from annotation processing
原因分析:循環依賴 死循環了

解決方案:修改模組中的依賴
2.IDEA修改pom不生效問題
在使用IDEA開發多項目的時候發現這樣一個問題:修改pom文件之後,不管怎麼刷新都不生效

解決方案:重啟 IDEA 即可
總結
本文涉及源碼下載地址:https://gitee.com/bingqilinpeishenme/multi-module-demo
恭喜你完成了本章的學習,為你鼓掌!如果本文對你有幫助,請幫忙點贊,評論,轉發,這對作者很重要,謝謝。

讓我們再次回顧本文的學習目標
- 掌握SpringBoot中多模組開發
要掌握SpringBoot更多的用法,請持續關注本系列教程。

