SpringBoot圖文教程16—SpringBoot 多模組開發「web」「打包」

  • 2020 年 3 月 30 日
  • 筆記

前言

本文已經收錄碼雲倉庫:https://gitee.com/bingqilinpeishenme/Java-Tutorials 本文涉及源碼下載地址:https://gitee.com/bingqilinpeishenme/multi-module-demo

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

那麼這樣項目結構的項目是如何設計出來的呢?

SpringBoot 多模組開發

技術選型:

父級工程開發

父級工程可以用來統一管理所有項目的依賴,如圖,如果在父級項目中有一個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 只是聲明依賴,並不實際引入,因此子項目需要顯式聲明需要用到的依賴

子項目開發

子項目開發的步驟如下:

  1. 基於Project創建module
  2. 修改pom
  3. 寫配置,沒有可以不寫
  4. 寫程式碼

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更多的用法,請持續關注本系列教程。

Tags: