前提
这篇文章是《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
进入创建新项目的界面:
![28fca6cdddfa8316cbf9df328fdc32ce.png](https://i-blog.csdnimg.cn/blog_migrate/ef394bb37c15196839db5dd294797de0.png)
选择左侧的Maven
选项,上方下拉选择好JDK
版本,勾选Create from archetype
,然后选中maven-archetype-webapp
这个骨架的RELEASE
版本,然后点击「下一步」按钮:
![b23ac8ff2399ebd34c866490d894c09e.png](https://i-blog.csdnimg.cn/blog_migrate/bc1ffbe7aeb9855bb554be78c6a66cfc.png)
输入项目的GAV
,选定项目的磁盘目录,然后点击「下一步」按钮:
![44e34730b7faa20a815e1bd982fe44ae.png](https://i-blog.csdnimg.cn/blog_migrate/af88f796f6068382cdd1477448f4e93a.png)
选定Maven
的安装路径、配置文件和本地仓库,配置好相应的属性,最后点击完成即可:
![54943c4b1b16aafd0d90a4888b5eb41c.png](https://i-blog.csdnimg.cn/blog_migrate/7e4111f1f62518f60d10099baa6e1bcf.png)
创建出来的是一个标准的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.0modelVersion>
<groupId>club.throwablegroupId>
<artifactId>spring-boot-guideartifactId>
<version>1.0-SNAPSHOTversion>
<packaging>jarpackaging>
<name>spring-boot-guidename>
<properties>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
<maven.compiler.source>1.8maven.compiler.source>
<maven.compiler.target>1.8maven.compiler.target>
<maven.compiler.plugin.version>3.8.1maven.compiler.plugin.version>
<lombok.version>1.18.12lombok.version>
<spring.boot.version>2.3.1.RELEASEspring.boot.version>
properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-dependenciesartifactId>
<version>${spring.boot.version}version>
<scope>importscope>
<type>pomtype>
dependency>
dependencies>
dependencyManagement>
<dependencies>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<version>${lombok.version}version>
<scope>providedscope>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starterartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
dependencies>
<build>
<finalName>spring-boot-guidefinalName>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-compiler-pluginartifactId>
<version>${maven.compiler.plugin.version}version>
<configuration>
<source>${maven.compiler.source}source>
<target>${maven.compiler.targettarget>
<encoding>${project.build.sourceEncoding}encoding>
configuration>
plugin>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
<version>${spring.boot.version}version>
<executions>
<execution>
<goals>
<goal>repackagegoal>
goals>
execution>
executions>
plugin>
plugins>
build>
project>
有依赖版本变动,只需要直接修改properties
元素中对应的版本号即可。在src/main
下新建启动类java/club/throwable/App.java
:
![b0ffb30bcbde74ab3615ab0cf2041354.png](https://i-blog.csdnimg.cn/blog_migrate/870c570e13340f00c653dbfd95ced478.png)
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
函数后输出如下:
![85327b20af7cefb02ddde43aa28a9b66.png](https://i-blog.csdnimg.cn/blog_migrate/d5e13139633c7385187a9f3a92b7abae.png)
spring-boot-starter
模块引入的只是核心容器组件,并没有集成像Tomcat
这样的Servlet
容器,启动后不会挂起主线程,所以执行完CommandLineRunner
中的逻辑就会自行退出主线程。
创建一个多模块的SpringBoot应用
多模块应用的创建基于单模块应用,准确来说就是在一个创建完的单模块应用中添加新的模块(New Module
)。在原来的根项目spring-boot-guide
右键弹出菜单中选择新建模块:
![dcb0cc07c4f0aef376b168f5fedee526.png](https://i-blog.csdnimg.cn/blog_migrate/8b48d4f89fc82e134f8a5183614674ba.png)
后续的步骤与上一小节的过程完全相同,不过定义的模块名称必须和根项目的名称不相同,这里定义为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.0modelVersion>
<groupId>club.throwablegroupId>
<artifactId>spring-boot-guideartifactId>
<version>1.0-SNAPSHOTversion>
<modules>
<module>ch0-dependencymodule>
modules>
<packaging>pompackaging>
<name>spring-boot-guidename>
<properties>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
<maven.compiler.source>1.8maven.compiler.source>
<maven.compiler.target>1.8maven.compiler.target>
<maven.compiler.plugin.version>3.8.1maven.compiler.plugin.version>
<lombok.version>1.18.12lombok.version>
<spring.boot.version>2.3.1.RELEASEspring.boot.version>
properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-dependenciesartifactId>
<version>${spring.boot.version}version>
<scope>importscope>
<type>pomtype>
dependency>
dependencies>
dependencyManagement>
<dependencies>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<version>${lombok.version}version>
<scope>providedscope>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
dependencies>
<build>
<finalName>spring-boot-guidefinalName>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-compiler-pluginartifactId>
<version>${maven.compiler.plugin.version}version>
<configuration>
<source>${maven.compiler.source}source>
<target>${maven.compiler.targettarget>
<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.0modelVersion>
<parent>
<groupId>club.throwablegroupId>
<artifactId>spring-boot-guideartifactId>
<version>1.0-SNAPSHOTversion>
parent>
<artifactId>ch0-dependencyartifactId>
<version>1.0-SNAPSHOTversion>
<packaging>jarpackaging>
<name>ch0-dependencyname>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starterartifactId>
dependency>
dependencies>
<build>
<finalName>ch0-dependencyfinalName>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
<version>${spring.boot.version}version>
<executions>
<execution>
<goals>
<goal>repackagegoal>
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
子模块中,如下:
![7e72953a7bd037eac7cf93762147928d.png](https://i-blog.csdnimg.cn/blog_migrate/42d7ef0227cb7ab693c9f6e1a75e23bc.png)
后面再添加其他新的模块,直接重复上述的步骤即可。
代码仓库
这里给出本文搭建的一个多模块的SpringBoot
应用的仓库地址(持续更新):
- Github:https://github.com/zjcscut/spring-boot-guide
(本文完 c-2-d e-a-20200701 8:39 AM)
技术公众号(《Throwable文摘》,id:throwable-doge),不定期推送笔者原创技术文章(绝不抄袭或者转载):
![8eb9db7c538a300158e725028ee1eb2f.png](https://i-blog.csdnimg.cn/blog_migrate/0345a98dfe346091dd587d06c1754cb8.png)