为什么要使用 spring-boot-starter-parent?
在 Spring Boot 项目中,spring-boot-starter-parent 是一个特殊的 Maven 项目,通常被用作我们自己项目的父项目(Parent POM)。
使用它的主要原因可以归纳为以下几点:简化配置、版本仲裁(避免冲突)以及提供合理的默认设置。
以下是详细的解释:
1. 依赖版本仲裁 (Dependency Management) —— 最核心的功能
这是使用它最大的好处。spring-boot-starter-parent 继承自 spring-boot-dependencies。它维护了一个巨大的“物料清单”(BOM),其中包含了 Spring Boot 及其常用第三方库(如 Jackson, Hibernate, SLF4J 等)的兼容版本号。
- 好处: 当你在
pom.xml中引入依赖(例如spring-boot-starter-web)时,不需要写<version>标签。 - 结果: Spring Boot 会自动使用经过测试的、互相兼容的版本。这极大地避免了“依赖地狱”(Dependency Hell)和版本冲突问题。
示例:
<!-- 只需要引入 artifactId,不需要 version -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- 版本号由 parent 自动管理 -->
</dependency>
2. 默认的插件配置 (Default Plugin Configuration)
它预先配置了许多常用的 Maven 插件,省去了你手动配置的麻烦:
- maven-compiler-plugin: 默认设置了 Java 编译版本(通常是 Java 8 或 17,取决于 Spring Boot 版本)和 UTF-8 编码。
- maven-surefire-plugin: 配置了单元测试的运行环境。
- maven-jar-plugin: 优化了 JAR 包的生成配置。
- spring-boot-maven-plugin: 虽然你通常需要在
<plugins>中显式声明它,但 Parent 已经管理了它的版本和 executions(repackage 目标),确保mvn package能打出可执行的 JAR 包。
3. 统一的属性配置 (Properties Configuration)
它定义了许多默认的属性,你可以通过在自己的 pom.xml 中重写这些属性来快速修改配置,而不需要去修改复杂的插件配置。
常见场景:修改 Java 版本
<properties>
<java.version>17</java.version>
</properties>
只需这一行,编译器插件就会自动使用 Java 17 进行编译。
4. 资源过滤 (Resource Filtering)
它默认配置了对 application.properties 和 application.yml 等资源文件的过滤功能。
- 好处: 允许你在配置文件中使用 Maven 的属性占位符(例如
@project.version@)。Spring Boot 会在构建时将其替换为实际的值。
5. 什么时候不使用它?
虽然 spring-boot-starter-parent 很方便,但 Maven 规定一个项目只能有一个 <parent>。
如果你所在的公司有自己的企业级父 POM(Corporate Parent POM),你就不能继承 Spring Boot 的 parent 了。
在这种情况下,你可以使用 "BOM 导入" (Bill of Materials) 的方式来获得“版本仲裁”的好处,但会失去插件默认配置和资源过滤功能:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>3.1.0</version> <!-- 指定 Spring Boot 版本 -->
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
总结
使用 spring-boot-starter-parent 就像是站在巨人的肩膀上:
- 省心:不用操心几百个库的版本号。
- 稳定:使用的版本组合是经过官方验证兼容的。
- 规范:提供了标准的编译和打包配置。