在搭建多模块项目的时候,会遇到这个问题:多个子模块都需要用 Spring Boot,怎么统一管理依赖版本呢?
Spring Boot 提供了两种集成方式,各有各的使用场景。
两种方式对比
方式一:继承 spring-boot-starter-parent
这是最常见的方式,直接让项目继承 Spring Boot 的父 pom。
优点:
- 配置简单,开箱即用
- 自动管理大量依赖版本
- 提供了很多默认配置(插件、资源过滤等)
缺点:
- 一个项目只能有一个父 pom
- 如果企业有自己的父 pom,就冲突了
- 不够灵活,受 Spring Boot 父 pom 限制
示例:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.5.0</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- 不需要指定版本 -->
</dependency>
</dependencies>方式二:使用 dependencyManagement 导入
这种方式不继承 Spring Boot 父 pom,而是通过 dependencyManagement 导入依赖管理。
优点:
- 可以自定义父 pom
- 适合企业多模块项目
- 灵活性高,不受 Spring Boot 父 pom 限制
- 可以同时管理多个框架的依赖版本
缺点:
- 需要手动配置一些默认属性(如 Java 版本、编码等)
- 配置相对复杂一些
示例:
父 pom 配置:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>3.5.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>子模块使用:
<parent>
<groupId>wang.smalleyes.cloud</groupId>
<artifactId>multi-module-project</artifactId>
<version>1.0.0</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- 不需要指定版本 -->
</dependency>
</dependencies>实际应用
下面展示如何使用 方式二 搭建多模块项目。
父 pom 配置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>wang.smalleyes.cloud</groupId>
<artifactId>multi-module-project</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging>
<properties>
<java.version>21</java.version>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- Spring Boot 版本 -->
<spring-boot.version>3.5.0</spring-boot.version>
<!-- 常用依赖版本管理示例 -->
<lombok.version>1.18.36</lombok.version>
<hutool.version>5.8.34</hutool.version>
</properties>
<!-- 依赖管理 -->
<dependencyManagement>
<dependencies>
<!-- 导入 Spring Boot 依赖管理(包含所有 Spring Boot 相关依赖的版本) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- 其他依赖版本管理示例 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>${hutool.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<modules>
<module>module-example</module>
</modules>
</project>子模块配置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>wang.smalleyes.cloud</groupId>
<artifactId>multi-module-project</artifactId>
<version>1.0.0</version>
</parent>
<artifactId>module-example</artifactId>
<packaging>jar</packaging>
<dependencies>
<!-- Spring Boot 依赖,不需要指定版本 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>这样,所有子模块都可以统一使用父 pom 管理的依赖版本,不需要每个模块都重复配置。
如何选择
使用 parent 方式的场景:
- 单体项目,不需要自定义父 pom
- 快速开发,不想配置太多
- 个人项目或小型项目
使用 dependencyManagement 方式的场景:
- 企业多模块项目,需要统一管理依赖
- 有自己的父 pom(企业内部框架)
- 需要同时管理多个技术栈的版本(Spring Boot + Spring Cloud + 其他)
- 大型项目,需要更灵活的依赖管理
注意事项
使用 dependencyManagement 方式时,需要手动配置一些属性:
<properties>
<!-- Java 版本 -->
<java.version>21</java.version>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<!-- 项目编码 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- Spring Boot 版本 -->
<spring-boot.version>3.5.0</spring-boot.version>
</properties>这些属性在 spring-boot-starter-parent 中已经默认配置好了,但是使用 dependencyManagement 方式时需要手动指定。
总结
两种方式各有优势:
- parent 方式:简单直接,适合快速开发和小型项目
- dependencyManagement 方式:灵活强大,适合企业多模块项目
在实际项目中,根据需求选择合适的方式就好。
对于多模块项目,dependencyManagement 方式更加合适,可以统一管理所有子模块的依赖版本,后续添加新模块也会更方便。
这种方式可以很灵活地扩展,如果后续需要集成 Spring Cloud 或其他框架,只需要在父 pom 的 dependencyManagement 中添加对应的依赖管理即可。