前提
這篇文章是《SpringBoot2.x入門》專輯的第2篇文章,使用的SpringBoot
版本為2.3.1.RELEASE
,JDK
版本為1.8
。
常規的套路會建議使用Spring
官方提供的工具Spring Initializr通過指定配置創建一個SpringBoot
項目,但是考慮到Spring Initializr必須聯網使用,對於項目配置和依賴的控制粒度不夠精細,本文會從更一般的情況考慮,詳細分析怎么通過Maven
和IntelliJ IDEA
(下稱IDEA
)快速創建一個SpringBoot
應用,包括單模塊的Maven
和多模塊的Maven
應用創建。
依賴分析
必要的插件:
Maven
編譯插件:maven-compiler-plugin
。SpringBoot
封裝的Maven
插件(一般必選,項目最終打包依賴到這個插件,它的版本建議跟隨選用的SpringBoot的版本):spring-boot-maven-plugin
。
Maven
編譯插件盡可能選用高版本,以適配更高版本的JDK
。一般會選用的基本依賴如下:
lombok
(可選,個人認為能提高開發效率,不過需要安裝對應的插件)。junit
(spring-boot-starter-test
):單元測試。spring-boot-starter
:Bean
管理、配置讀取等,簡單理解就是IOC
容器核心組件和一些擴展。spring-boot-starter-web
:基於spring-boot-starter
擴展,主要集成了SpringMVC
的功能。
多數情況下,選用spring-boot-starter-web即可,版本選取REALEASE版本即可,注意盡可能整套項目使用同一個大版本的SpringBoot。
下面例子用到的各個組件的版本如下:
序號 | 組件 | 版本號 | 描述 |
---|---|---|---|
1 | maven-compiler-plugin |
3.8.1 |
Maven 編譯插件 |
2 | spring-boot-starter |
2.3.1.RELEASE |
IOC 容器核心組件 |
3 | spring-boot-maven-plugin |
2.3.1.RELEASE |
SpringBoot 封裝的Maven 插件 |
4 | lombok |
1.18.12 |
- |
創建一個單模塊的SpringBoot應用
點擊IDEA
主菜單File -> Project
進入創建新項目的界面:
選擇左側的Maven
選項,上方下拉選擇好JDK
版本,勾選Create from archetype
,然后選中maven-archetype-webapp
這個骨架的RELEASE
版本,然后點擊下一步按鈕:
輸入項目的GAV
,選定項目的磁盤目錄,然后點擊下一步按鈕:
選定Maven
的安裝路徑、配置文件和本地倉庫,配置好相應的屬性,最后點擊完成即可:
創建出來的是一個標准的Maven
項目,它的結構如下:
spring-boot-guide
- src
- main
- webapp
- web.xml
- pom.xml
一般可以直接刪除src/main/webapp
目錄,在pom.xml
中增加對應的依賴,最終的pom.xml
如下:
<?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>
<groupId>club.throwable</groupId>
<artifactId>spring-boot-guide</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 指定打包方式為Jar -->
<packaging>jar</packaging>
<name>spring-boot-guide</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.plugin.version>3.8.1</maven.compiler.plugin.version>
<lombok.version>1.18.12</lombok.version>
<spring.boot.version>2.3.1.RELEASE</spring.boot.version>
</properties>
<!-- BOM全局管理starter版本 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring.boot.version}</version>
<scope>import</scope>
<type>pom</type>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<scope>provided</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>
<build>
<!-- 指定最終打出來的Jar包的名稱 -->
<finalName>spring-boot-guide</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven.compiler.plugin.version}</version>
<configuration>
<source>${maven.compiler.source}</source>
<target>${maven.compiler.target</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring.boot.version}</version>
<!-- <configuration>-->
<!-- <mainClass>可選配置,這里填寫啟動類的全類名</mainClass>-->
<!-- </configuration>-->
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
有依賴版本變動,只需要直接修改properties
元素中對應的版本號即可。在src/main
下新建啟動類java/club/throwable/App.java
:
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@Slf4j
@SpringBootApplication
public class App implements CommandLineRunner {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
@Override
public void run(String... args) throws Exception {
log.info("Hello SpringBoot!");
}
}
啟動App
中的main
函數后輸出如下:
spring-boot-starter
模塊引入的只是核心容器組件,並沒有集成像Tomcat
這樣的Servlet
容器,啟動后不會掛起主線程,所以執行完CommandLineRunner
中的邏輯就會自行退出主線程。
創建一個多模塊的SpringBoot應用
多模塊應用的創建基於單模塊應用,准確來說就是在一個創建完的單模塊應用中添加新的模塊(New Module
)。在原來的根項目spring-boot-guide
右鍵彈出菜單中選擇新建模塊:
后續的步驟與上一小節的過程完全相同,不過定義的模塊名稱必須和根項目的名稱不相同,這里定義為ch0-dependency
,然后調整父pom.xml
和子pom.xml
:
spring-boot-guide -> pom.xml
<?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>
<groupId>club.throwable</groupId>
<artifactId>spring-boot-guide</artifactId>
<version>1.0-SNAPSHOT</version>
<modules>
<module>ch0-dependency</module>
</modules>
<packaging>pom</packaging>
<name>spring-boot-guide</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.plugin.version>3.8.1</maven.compiler.plugin.version>
<lombok.version>1.18.12</lombok.version>
<spring.boot.version>2.3.1.RELEASE</spring.boot.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring.boot.version}</version>
<scope>import</scope>
<type>pom</type>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>spring-boot-guide</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven.compiler.plugin.version}</version>
<configuration>
<source>${maven.compiler.source}</source>
<target>${maven.compiler.target</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
spring-boot-guide/ch0-dependency -> pom.xml
<?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>
<parent>
<groupId>club.throwable</groupId>
<artifactId>spring-boot-guide</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>ch0-dependency</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>ch0-dependency</name>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
</dependencies>
<build>
<finalName>ch0-dependency</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring.boot.version}</version>
<!-- <configuration>-->
<!-- <mainClass>club.throwable.App</mainClass>-->
<!-- </configuration>-->
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
注意:
spring-boot-maven-plugin
一般情況下只需配置在需要打包的模塊中,一般父模塊是全局管理的模塊,不需要全局定義此插件。maven-compiler-plugin
可以配置在父模塊中,讓所有子模塊都應用此插件。spring-boot-starter-test
和lombok
可以在父模塊的dependencies
元素中添加,相當於所有子模塊都引入了這兩個依賴。
父模塊中的spring-boot-guide
的src
模塊需要丟棄,可以直接剪切到ch0-dependency
子模塊中,如下:
后面再添加其他新的模塊,直接重復上述的步驟即可。
代碼倉庫
這里給出本文搭建的一個多模塊的SpringBoot
應用的倉庫地址(持續更新):
(本文完 c-2-d e-a-20200701 8:39 AM)
技術公眾號(《Throwable文摘》,id:throwable-doge),不定期推送筆者原創技術文章(絕不抄襲或者轉載):