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