Spring Boot 与 Maven 依赖管理详解

目录

前言

在日常 Java 开发中,我们几乎都会接触到 Maven 和 Spring Boot。

很多初学者会有以下疑问:

  • dependenciesdependencyManagement 有什么区别?
  • Maven 多模块项目如何管理依赖?
  • Spring Boot 为什么只引入一个 Starter 就能使用很多功能?
  • spring-boot-starter-parentspring-boot-starterspring-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(按需引入)
相关推荐
宸津-代码粉碎机1 小时前
Spring AI企业级实战|智能记忆摘要+自动遗忘机制落地,彻底解决上下文爆炸与Token冗余
java·大数据·人工智能·后端·python·spring
南极企鹅1 小时前
springboot项目不退出的原因
java·spring boot·后端
仍然.1 小时前
SpringBoot快速上手
java·spring boot·后端
浮尘笔记2 小时前
Go实现大文件异步流式采集引擎
开发语言·后端·golang
霸道流氓气质2 小时前
Spring Boot 大数据量 Excel 导入导出功能实现指南
spring boot·后端·excel
小刘|2 小时前
Spring AI 结构化输出 + 大模型参数全解(含千问调优)
java·后端·spring
copyer_xyf2 小时前
FastAPI 项目骨架搭建
前端·后端·python
laowangpython2 小时前
tokio-rstracing:Rust 可观测性的标准答案
开发语言·后端·其他·rust
IT_陈寒2 小时前
Python虚拟环境的这个坑,我居然绕了三天才爬出来
前端·人工智能·后端