一、前言
最近公司项目准备开始重构,框架选定为 Spring Boot ,本篇主要记录了在 IDEA 中搭建 Spring Boot Maven 多模块项目的过程。
二、软件及硬件环境
- macOS Sierra 10.12.6
- IntelliJ IDEA 2018.2
- JDK 1.8
- Maven 3.2.1
- Spring Boot 2.0.4
三、项目结构
- biz 层(业务逻辑层)
- dao 层(数据持久层)
- common 层(公用组件层)
- web 层(请求处理层)
注:biz 层依赖 dao 及 common 层, web 层依赖 biz 层
四、项目搭建
4.1 创建父工程
① IDEA 主面板选择菜单「Create New Project 」或者工具栏选择菜单「 File -> New -> Project… 」
② 侧边栏选择「 Spring Initializr 」,Initializr 默认选择 Default ,然后点击「 Next 」
③ 修改 Group 、 Artifact 、 Package 输入框中的值后点击「 Next 」
④ 这步暂时先不需要选择,直接点「 Next 」
⑤ 点击「 Finish 」创建项目
⑥ 最终得到的项目目录结构如下
|-- demo
|-- .gitignore
|-- mvnw
|-- mvnw.cmd
|-- pom.xml
|-- .mvn
| |-- wrapper
| |-- maven-wrapper.jar
| |-- maven-wrapper.properties
|-- src
|-- main
| |-- java
| | |-- com
| | |-- example
| | |-- demo
| | |-- DemoApplication.java
| |-- resources
| |-- application.properties
|-- test
|-- java
|-- com
|-- example
|-- demo
|-- DemoApplicationTests.java
⑦ 删除无用的 .mvn 目录、 src 目录、 mvnw 及 mvnw.cmd 文件,最终只留 .gitignore 和 pom.xml
4.2 创建子模块
① 选择项目根目录,右键呼出菜单,选择「 New -> Module 」
② 侧边栏选择「 Maven 」,点击「 Next 」
③ 填写 ArifactId ,点击「 Next 」
④ 修改 Module name 增加横杠提升可读性,点击「 Finish 」
⑤ 同理添加「 demo-dao 」、「 demo-common 」、「 demo-web 」子模块,最终得到项目目录结构如下
|-- demo
|-- .gitignore
|-- pom.xml
|-- demo-biz
| |-- pom.xml
| |-- src
| |-- main
| | |-- java
| | |-- resources
| |-- test
| |-- java
|-- demo-common
| |-- pom.xml
| |-- src
| |-- main
| | |-- java
| | |-- resources
| |-- test
| |-- java
|-- demo-dao
| |-- pom.xml
| |-- src
| |-- main
| | |-- java
| | |-- resources
| |-- test
| |-- java
|-- demo-web
|-- pom.xml
|-- src
|-- main
| |-- java
| |-- resources
|-- test
|-- java
4.3 整理父 pom 文件中的内容
① 删除 dependencies 标签及其中的 spring-boot-starter 和 spring-boot-starter-test 依赖,因为 Spring Boot 提供的父工程已包含,并且父 pom 原则上都是通过 dependencyManagement 标签管理依赖包。
注:dependencyManagement 及 dependencies 的区别自行查阅文档
② 删除 build 标签及其中的所有内容,spring-boot-maven-plugin 插件作用是打一个可运行的包,多模块项目仅仅需要在入口类所在的模块添加打包插件,这里父模块不需要打包运行。而且该插件已被包含在 Spring Boot 提供的父工程中,这里删掉即可。
③ 最后整理父 pom 文件中的其余内容,按其代表含义归类,整理结果如下:
<!-- 基本信息 -->
<modelVersion>4.0.0</modelVersion>
<packaging>pom</packaging>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<!-- 项目说明:这里作为聚合工程的父工程 -->
<groupId>com.example.demo</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!-- 继承说明:这里继承Spring Boot提供的父工程 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.2.RELEASE</version>
<relativePath/>
</parent>
<!-- 模块说明:这里声明多个子模块 -->
<modules>
<module>demo-biz</module>
<module>demo-common</module>
<module>demo-dao</module>
<module>demo-web</module>
</modules>
<!-- 属性说明 -->
<properties>
<java.version>1.8</java.version>
<demo.version>0.0.1-SNAPSHOT</demo.version>
</properties>
4.4 简易 HTTP 接口测试
准备工作都完成之后,通过一个简易的 HTTP 接口测试项目是否正常运行。
① 首先在 demo-web 层创建 com.example.demo.web 包并添加入口类 DemoWebApplication.java
注:com.example.demo.web 为多级目录结构并非单个目录名
package com.example.demo.web;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @author linjian
* @date 2019/1/15
*/
@SpringBootApplication
public class DemoWebApplication {
public static void main(String[] args) {
SpringApplication.run(DemoWebApplication.class, args);
}
}
② 其次在 demo-web 层的 pom 文件中添加必要的依赖包
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
② 然后在 com.example.demo.web 包中添加 controller 目录并新建一个 controller,添加 test 方法测试接口是否可以正常访问。
package com.example.demo.web.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author linjian
* @date 2019/1/15
*/
@RestController
@RequestMapping("demo")
public class DemoController {
@GetMapping("test")
public String test() {
return "Hello World!"