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