目录
- 前言
- [一、Maven 依赖管理](#一、Maven 依赖管理)
- 二、多模块项目最佳实践
-
- [2.1 推荐结构](#2.1 推荐结构)
- [2.2 统一管理版本](#2.2 统一管理版本)
- [2.3 公共依赖](#2.3 公共依赖)
- [2.4 企业项目推荐模式](#2.4 企业项目推荐模式)
- [三、Spring Boot 版本与 JDK 对照表](#三、Spring Boot 版本与 JDK 对照表)
- [四、Spring Boot Starter 机制](#四、Spring Boot Starter 机制)
-
- [4.1 什么是 Starter](#4.1 什么是 Starter)
- [4.2 Starter 的真正价值](#4.2 Starter 的真正价值)
- 五、spring-boot-starter-parent
- 六、spring-boot-starter
-
- [6.1 是什么](#6.1 是什么)
- [6.2 引入内容](#6.2 引入内容)
- [6.3 不包含](#6.3 不包含)
- 七、spring-boot-starter-web
-
- [7.1 是什么](#7.1 是什么)
- [7.2 依赖结构](#7.2 依赖结构)
- [7.3 可以直接使用](#7.3 可以直接使用)
- 八、spring-boot-starter-test
-
- [8.1 为什么需要](#8.1 为什么需要)
- [8.2 包含内容](#8.2 包含内容)
- [8.3 常见测试](#8.3 常见测试)
- [8.4 scope=test](#8.4 scope=test)
- [九、必须使用 starter-parent 吗?](#九、必须使用 starter-parent 吗?)
- 十、三者关系图
- [九、Spring Boot 项目标准依赖模板](#九、Spring Boot 项目标准依赖模板)
- 十、总结
前言
在日常 Java 开发中,我们几乎都会接触到 Maven 和 Spring Boot。
很多初学者会有以下疑问:
dependencies和dependencyManagement有什么区别?- Maven 多模块项目如何管理依赖?
- Spring Boot 为什么只引入一个 Starter 就能使用很多功能?
spring-boot-starter-parent、spring-boot-starter、spring-boot-starter-web有什么区别?- 单元测试为什么还要引入
spring-boot-starter-test? - Spring Boot 各版本支持哪些 JDK?
本文将系统梳理这些知识点。
一、Maven 依赖管理
1.1 dependencies
作用
用于真正引入依赖。
例如:
父工程:
xml
<project>
<packaging>pom</packaging>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.42</version>
</dependency>
</dependencies>
</project>
子模块:
xml
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
这种情况下:
- 子模块会自动继承该依赖
- 实际上子模块甚至不用再写这段 dependency
- Maven 会自动传递给所有子模块
可以执行:
bash
mvn dependency:tree
查看依赖树验证。
1.2 dependencyManagement(推荐)
作用
用于:
text
统一管理依赖版本
例如:
xml
<project>
<packaging>pom</packaging>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>shardingsphere-jdbc</artifactId>
<version>5.5.2</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
子模块:
xml
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>shardingsphere-jdbc</artifactId>
</dependency>
无需再写:
xml
<version>5.5.2</version>
这种情况下:
- 子模块必须声明 dependency
- 但不需要写 version
- Maven 会从父工程的
dependencyManagement中找到版本号
注意
dependencyManagement
不会自动引入依赖。
例如:
xml
<dependencyManagement>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>9.3.0</version>
</dependency>
</dependencies>
</dependencyManagement>
子模块如果不写:
xml
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
</dependency>
是无法使用 MySQL 驱动的。
1.3 两者区别
| 项目 | dependencies | dependencyManagement |
|---|---|---|
| 是否引入依赖 | ✅ | ❌ |
| 是否管理版本 | ✅ | ✅ |
| 子模块自动拥有 | ✅ | ❌ |
| 企业项目推荐 | 公共依赖 | 统一版本 |
二、多模块项目最佳实践
2.1 推荐结构
text
root-parent
│
├── user-service
├── order-service
├── pay-service
└── common
父工程:
xml
<project>
<packaging>pom</packaging>
</project>
2.2 统一管理版本
xml
<dependencyManagement>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>9.3.0</version>
</dependency>
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>shardingsphere-jdbc</artifactId>
<version>5.5.2</version>
</dependency>
</dependencies>
</dependencyManagement>
2.3 公共依赖
xml
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
所有模块自动继承。
2.4 企业项目推荐模式
text
dependencyManagement
↓
统一版本
dependencies
↓
公共依赖
子模块 dependencies
↓
按需引入
三、Spring Boot 版本与 JDK 对照表
| Spring Boot | Spring Framework | 最低 JDK |
|---|---|---|
| 1.x | 4.x | Java 7 |
| 2.0~2.7 | 5.x | Java 8 |
| 3.x | 6.x | Java 17 |
| 4.x | 7.x | Java 17 |
JDK8 推荐版本
text
Spring Boot 2.7.18
这是 Spring Boot 2.x 最后一个正式版本。
JDK17 推荐版本
text
Spring Boot 3.x
常见组合
老项目
text
JDK8
Spring Boot 2.7.18
MyBatis
MySQL
Redis
新项目
text
JDK17
Spring Boot 3.x
Spring Cloud 2025+
四、Spring Boot Starter 机制
4.1 什么是 Starter
Starter 本质上是:
text
依赖聚合包
作用:
text
一次性引入一组兼容的依赖
例如:
xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
实际上会引入:
text
spring-web
spring-webmvc
tomcat
jackson
validation
spring-boot
spring-boot-autoconfigure
4.2 Starter 的真正价值
Starter ≠ 自动配置
实际上:
text
Starter
+
AutoConfiguration
=
开箱即用
例如:
yaml
spring:
redis:
host: localhost
然后:
java
@Autowired
private RedisTemplate redisTemplate;
直接可用。
原因:
text
Redis Starter
↓
RedisAutoConfiguration
↓
自动创建 Bean
五、spring-boot-starter-parent
5.1 是什么
xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.18</version>
</parent>
它是:
text
Maven 父工程
5.2 作用
统一管理版本
例如:
xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
无需指定版本。
管理插件版本
例如:
text
maven-compiler-plugin
maven-surefire-plugin
spring-boot-maven-plugin
提供默认配置
例如:
text
UTF-8
Java版本
资源过滤
5.3 注意
它:
text
不提供 Spring Boot 功能
只是管理 Maven 配置。
六、spring-boot-starter
6.1 是什么
Spring Boot 核心启动器。
xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
6.2 引入内容
text
spring-core
spring-context
spring-beans
spring-aop
spring-boot
spring-boot-autoconfigure
logging
6.3 不包含
text
spring-web
spring-webmvc
tomcat
因此:
java
@RestController
无法使用。
七、spring-boot-starter-web
注意:正确名称是
spring-boot-starter-web,不是spring-boot-web。
7.1 是什么
Spring Boot Web 开发启动器。
xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
7.2 依赖结构
text
spring-boot-starter-web
│
├── spring-boot-starter
├── spring-web
├── spring-webmvc
├── jackson
├── validation
└── tomcat
注意:
tex
spring-boot-starter-web
已经包含
spring-boot-starter
所以,对于 web 项目:
xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
即可,spring-boot-starter会被自动引入,无需再手动引入。
7.3 可以直接使用
java
@RestController
@RequestMapping
@GetMapping
@PostMapping
八、spring-boot-starter-test
8.1 为什么需要
Web Starter 不包含测试框架。
如果要进行单元测试,需要引入:
xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
8.2 包含内容
text
JUnit5
Mockito
AssertJ
Hamcrest
Spring Test
JSONassert
8.3 常见测试
SpringBootTest
java
@SpringBootTest
class UserServiceTest {
@Autowired
private UserService userService;
@Test
void test() {
}
}
Mockito
java
@ExtendWith(MockitoExtension.class)
class UserServiceTest {
@Mock
private UserMapper userMapper;
@InjectMocks
private UserService userService;
}
8.4 scope=test
xml
<scope>test</scope>
表示:
| 阶段 | 可用 |
|---|---|
| main编译 | ❌ |
| test编译 | ✅ |
| test运行 | ✅ |
| 打包Jar | ❌ |
因此测试框架不会进入生产环境。
九、必须使用 starter-parent 吗?
不是必须,Spring Boot 官方支持两种方式。
方式1(推荐)
xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.18</version>
</parent>
然后:
xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
不用写版本。
这是最简单的方式。
方式2(企业项目常见)
很多公司已经有自己的父工程:
xml
<parent>
<groupId>com.company</groupId>
<artifactId>company-parent</artifactId>
</parent>
这时候不能再继承:
xml
spring-boot-starter-parent
因为Maven只能有一个parent。
于是改成:
xml
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.7.18</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
效果和 starter-parent 几乎一样。
十、三者关系图
tex
spring-boot-starter-parent
│
├── 管理版本
├── 管理插件
└── 不提供功能
spring-boot-starter
│
├── spring-core
├── spring-context
├── spring-boot
└── logging
spring-boot-starter-web
│
├── spring-boot-starter
├── spring-web
├── spring-webmvc
├── jackson
└── tomcat
九、Spring Boot 项目标准依赖模板
对于 JDK8 + Spring Boot 2.7.18 项目:
xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.18</version>
</parent>
<dependencies>
<!-- Web开发 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- 单元测试 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
十、总结
Maven
text
dependencies
↓
真正引入依赖
dependencyManagement
↓
统一管理版本
Spring Boot
text
spring-boot-starter-parent
↓
管理版本和插件
spring-boot-starter
↓
Boot核心功能
spring-boot-starter-web
↓
Web开发
spring-boot-starter-test
↓
单元测试
推荐组合
JDK8
text
Spring Boot 2.7.18
JDK17+
text
Spring Boot 3.x
多模块项目
text
父工程
├── dependencyManagement(统一版本)
├── dependencies(公共依赖)
└── modules
子模块
└── dependencies(按需引入)