Spring Boot 与 Maven 依赖管理的基本步骤和示例

 更新时间:2026年06月13日 11:30:10   作者:西凉的悲伤  
在Spring Boot项目中,依赖管理通常通过Maven来实现,下面下面介绍是如何在Spring Boot项目中利用Maven进行依赖管理的基本步骤和示例,感兴趣的朋友一起看看吧

在Spring Boot项目中,依赖管理通常通过Maven来实现。Spring Boot提供了一个特殊的starter POM,spring-boot-starter-parent,它提供了一个基础的依赖管理环境,使得项目可以继承并使用Spring Boot的依赖管理。下面是如何在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

作用

用于真正引入依赖

例如:

父工程:

<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 两者区别

项目dependenciesdependencyManagement
是否引入依赖
是否管理版本
子模块自动拥有
企业项目推荐公共依赖统一版本

二、多模块项目最佳实践

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 BootSpring Framework最低 JDK
1.x4.xJava 7
2.0~2.75.xJava 8
3.x6.xJava 17
4.x7.xJava 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-autoconfigure

4.2 Starter 的真正价值

Starter ≠ 自动配置

实际上:

Starter
+
AutoConfiguration
=
开箱即用

例如:

spring:
  redis:
    host: localhost

然后:

@Autowired
private RedisTemplate redisTemplate;

直接可用。

原因:

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
logging

6.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
JSONassert

8.3 常见测试

SpringBootTest

@SpringBootTest
class UserServiceTest {
    @Autowired
    private UserService userService;
    @Test
    void test() {
    }
}

Mockito

@ExtendWith(MockitoExtension.class)
class UserServiceTest {
    @Mock
    private UserMapper userMapper;
    @InjectMocks
    private UserService userService;
}

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.18

JDK17+

Spring Boot 3.x

多模块项目

父工程
├── dependencyManagement(统一版本)
├── dependencies(公共依赖)
└── modules
子模块
└── dependencies(按需引入)

到此这篇关于Spring Boot 与 Maven 依赖管理的基本步骤和示例的文章就介绍到这了,更多相关Spring Boot Maven 依赖管理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java高级特性之反射机制实例详解

    Java高级特性之反射机制实例详解

    这篇文章主要介绍了Java高级特性之反射机制,结合实例形式详细分析了Java反射机制原理、功能、使用方法及相关操作注意事项,需要的朋友可以参考下
    2018-08-08
  • Java输出打印工具类封装的实例

    Java输出打印工具类封装的实例

    下面小编就为大家带来一篇Java输出打印工具类封装的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • MyBatis类型处理器TypeHandler的作用及说明

    MyBatis类型处理器TypeHandler的作用及说明

    这篇文章主要介绍了MyBatis类型处理器TypeHandler的作用及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-03-03
  • Java序列化反序列化原理及漏洞解决方案

    Java序列化反序列化原理及漏洞解决方案

    这篇文章主要介绍了Java序列化反序列化原理及漏洞解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • 深入探究Java @MapperScan实现原理

    深入探究Java @MapperScan实现原理

    之前是直接在Mapper类上面添加注解@Mapper,这种方式要求每一个mapper类都需要添加此注解,麻烦。通过使用@MapperScan可以指定要扫描的Mapper类的包的路径,这篇文章深入探究Java @MapperScan的实现原理
    2023-01-01
  • 解决springcloud-eureka注册时的ip问题

    解决springcloud-eureka注册时的ip问题

    这篇文章主要介绍了解决springcloud-eureka注册时的ip问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • Java 创建对象的几种常见方式

    Java 创建对象的几种常见方式

    本文将带你深入探索Java创建对象的5种常用方式,剖析它们的底层原理、适用场景及优缺点,帮助你在不同场景下做出最优选择,感兴趣的朋友跟随小编一起看看吧
    2025-09-09
  • Spring如何使用PropertyPlaceholderConfigurer读取文件

    Spring如何使用PropertyPlaceholderConfigurer读取文件

    这篇文章主要介绍了Spring如何使用PropertyPlaceholderConfigurer读取文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • Java 利用栈来反转链表和排序的操作

    Java 利用栈来反转链表和排序的操作

    这篇文章主要介绍了Java 利用栈来反转链表和排序的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • Springboot配置文件加密方式

    Springboot配置文件加密方式

    文章介绍了使用Jasypt对服务器配置文件进行加密,包括引入依赖、配置密钥、生成密钥、IDEA和Linux启动配置等步骤,解决了版本和JCE安全插件的问题
    2025-10-10

最新评论