1. 程式人生 > >IDEA SpringBoot多模組專案搭建詳細過程

IDEA SpringBoot多模組專案搭建詳細過程

 

1. 專案介紹: 

    本專案包含一個父工程 demo  和 四 個子模組(demo-base, demo-dao, demo-service, demo-web), demo-base 為其他三個模組的公共內容, 四個模組都依賴父模組, demo-dao 依賴 demo-base;   demo-service 依賴 demo-dao, 間接依賴 demo-base;   demo-web 依賴 demo-service, 間接依賴demo-base和demo-dao

2. 搭建思路:

     先建立一個 Spring Initializr工程 demo 作為 父工程, 然後在父工程再建四個子 Module (demo-base, demo-demo-dao, demo-service), 其實他們就是四個普通的Spring Initializr工程

3.開始搭建

   首先,建立一個Spring Initializr專案 和 子Module

 

 

 

            

 

!!!!注意:  修改demo 的 pom 檔案中的打包方式為 pom 

好戲開始:

剛才演示建立成一個SpringBoot 工程, 下面正式開始演示搭建多模組

(1) 第一步, 刪除剛才建立工程裡的檔案, 只保留(.idea資料夾 , 和專案 pom 檔案, 以及一個 *.iml 檔案 )

 

(2)第二步, 建立子 Module (demo-base, demo-dao,  demo-service 和 demo-web)  先建立demo-base子工程

 

 

建立好了 demo-base 子專案 , 為子工程 demo-base 生命父工程以及 為 父工程宣告子 Module(在 demo 和 demo-base 的 pom 檔案中新增如下程式碼)

     ---->在 demo-base 中 宣告父工程, 注意:此時demo-base繼承的是 SpringBoot提供的父工程, 需要修改<parent></parent>

           中的版本資訊, 修改成父專案 demo 的版本資訊(直接將父專案 demo 的pom檔案 中的版本資訊複製貼上到 mode-base             中即可)

    

 

<parent>
        <groupId>demo</groupId>
        <artifactId>demo</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <relativePath/> <!-- lookup parent from repository -->
</parent>

    ----宣告子 Module   

<modules>
         <module>demo-base</module>
</modules>

 

  修改後的父工程 demo 的 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>

    <!-- 父專案 demo 的版本資訊 -->
    <groupId>demo</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>demo</name>
    <description>Demo project for Spring Boot</description>

    <!-- 繼承說明:這裡繼承SpringBoot提供的父工程 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.16.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <!-- 宣告子模組 -->
    <modules>
        <module>demo-base</module>
    </modules>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <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>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


</project>

修改後的 demo-base 的 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>

    <!--  demo-base 的版本資訊 -->
    <groupId>demo</groupId>
    <artifactId>demo-base</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>demo-base</name>
    <description>Demo project for Spring Boot</description>

    <!-- 宣告父專案 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.16.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


</project>

 建立demo-dao, demo-service  建立方法一樣, 這裡只演示demo-dao的建立

 

 

 建立demo-web 模組與demo-dao建立除了第4步, 完全相同需要 新增 web依賴, 在建立過程的第4步需要新增 web 依賴

 

(4) 第三步 保留demo-web的啟動類 和 配置檔案, 其他專案的啟動類都刪除, 整個專案只需要一個啟動類和一個配置檔案 

demo-base:    /demo/demo-base/src/main/java/demobase/demo/DemoBaseApplication.java   刪除

                      /demo/demo-base/src/main/java/resource/*   刪除

demo-dao:    /demo/demo-dao/src/main/java/demodao/demo/DemoDaoApplication.java   刪除

                     /demo/demo-dao/src/main/java/resource/*   刪除

demo-service:    /demo/demo-service/src/main/java/demoservice/demo/DemoServiceApplication.java   刪除

                          /demo/demo-service/src/main/java/resource/*   刪除

(5)第四步 在 demo-dao 中新增 demo-base 的依賴資訊, 在 demo-service 中新增 demo-dao 的依賴資訊, 在 demo-web 中新增 demo-service 的依賴資訊,  依賴資訊新增到 各 pom 檔案下的  <dependencies> </dependencies>節點下

 新增依賴資訊後的 demo-dao 的依賴資訊

<dependencies>

        <!-- 新增 demo-base 的依賴 -->
        <dependency>
            <groupId>demo</groupId>
            <artifactId>demo-base</artifactId>
            <version>0.0.1-SNAPSHOT</version>
            <scope>compile</scope>
        </dependency>

        <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>
        </dependency>
</dependencies>
新增依賴資訊後的 demo-service 的依賴資訊
<dependencies>

        <!-- 新增 demo-dao 的依賴 -->
        <dependency>
            <groupId>demo</groupId>
            <artifactId>demo-dao</artifactId>
            <version>0.0.1-SNAPSHOT</version>
            <scope>compile</scope>
        </dependency>

        <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>
        </dependency>
</dependencies>

新增依賴資訊後的 demo-web 的依賴資訊

<dependencies>

        <!-- 新增 demo-service 的依賴 -->
        <dependency>
            <groupId>demo</groupId>
            <artifactId>demo-service</artifactId>
            <version>0.0.1-SNAPSHOT</version>
            <scope>compile</scope>
        </dependency>

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

(6)第五步 編寫測試程式碼

    編寫好程式碼後三個模組的目錄結構(demo-base還未用上, 但實際專案中很有用): 

 

  下面貼上程式碼: 

            給demo-dao 新增

  Demo.java

package demo.demodao;

import javax.persistence.*;

@Entity(name = "demo")  //設定實體名, 在資料庫中是表名
public class Demo {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)  //設定自動增長
    @Column(name = "id")
    private Integer id;
    

    @Column(name = "name") //設定資料庫欄位名    
    private String name;

    @Column(name = "id")
    private Integer id;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }
}

  DemoRepository.java 

package demo.demodao;

import org.springframework.data.jpa.repository.JpaRepository;

public interface DemoRepository extends JpaRepository<Demo, Integer> {

}

  DemoService.java

package demo.demoservice;

import demo.demodao.Demo;

import java.util.List;


public interface DemoService {

    Demo addOne(Demo demo);

}

 DemoServiceImpl.java

package demo.demoservice.impl;

import demo.demodao.Demo;
import demo.demodao.DemoRepository;
import demo.demoservice.DemoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class DemoServiceImpl implements DemoService {

    @Autowired
    private DemoRepository demoRepository;

    @Override
    public Demo addOne(Demo demo) {
        return this.demoRepository.save(demo);
    }
}

 DemoController.java  

package demo.demoweb;

import demo.demodao.Demo;
import demo.demoservice.DemoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class DemoController {

    @Autowired
    private DemoService demoService;

    @ResponseBody  // 返回 Json 資料
    @GetMapping("add")
    private Demo add(){
        Demo demo = new Demo();
        demo.setName("姓名");
        demo.setId(1);
        return demoService.addOne(demo); // 成功返回 儲存後的 demo
    }

}

第六步: 建立資料庫, 修改配置檔案

 建立輸資料庫 test

 修改配置檔案: 將 demo-web Resource目錄下 application.properties 檔名改為 applicatin.yml並新增以下內容:

spring:
  datasource:
    # jdbc:mysql://localhost:3306/test 資料庫地址
    url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&useSSL=false
    username: root # 資料庫使用者名稱
    password: xxxxxx  # 資料庫密碼
    driver-class-name: com.mysql.jdbc.Driver  # 資料庫驅動

  jpa:
      hibernate:
        ddl-auto: create-drop  #  create-drop  如果實體對應的表已存在,先刪除再建立,否則直接建立
        #  !!!注意: 第一次執行時可設定為 create-drop, 這樣就不需要手動建立資料庫表, 但是後面執行務必設定為none

(7) 第七步: 大功告成, 執行專案

     

直接執行會報錯

 已解決:將啟動類 DemoApplication 移動到 demo 包下

移動: 

執行成功!!!!!!! 

 

專案搭建過程中遇到的問題:  

      Error:(3, 20) java: 程式包demo.demodao不存在 

解決方法, 在控制檯執行 mvn clean