如何不使用Spring Boot父项目,改用BOM管理依赖?
问题
项目需要用BOM简化依赖管理,该需求无法调整。移除Spring Boot父项目后引入AWS、Spring Boot和JUnit5的BOM,但依赖无法正确下载,出现org.junit.jupiter.api、org.mockito包不存在等错误。
已尝试以下操作,均能正常运行:
- 不使用BOM运行代码
- 研究BOM使用方法
- 使用Spring Boot父项目运行
- 参考GitHub同类项目
报错信息:
package org.junit.jupiter.api does not exist package org.mockito does not exist cannot find symbol [ERROR] symbol: class ExtendWith
pom.xml内容:
<?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>org.example</groupId> <artifactId>bom-experiments</artifactId> <version>1.0-SNAPSHOT</version> <properties> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <junit-jupiter.version>5.7.2</junit-jupiter.version> <aws-sdk.version>2.18.16</aws-sdk.version> <mockito-inline.version>4.8.0</mockito-inline.version> <org.springframework.boot.version>2.7.5</org.springframework.boot.version> <org.springframework.version>5.3.24</org.springframework.version> <lombok.version>1.18.24</lombok.version> <maven-compiler-plugin.version>3.10.1</maven-compiler-plugin.version> <maven-surefire-plugin.version>3.0.0-M7</maven-surefire-plugin.version> <junit-jupiter-params.version>${junit-jupiter.version}</junit-jupiter-params.version> <kubernetes-maven-plugin.version>1.9.0</kubernetes-maven-plugin.version> <!-- Plugins --> <mockito.version>4.9.0</mockito.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-framework-bom</artifactId> <version>${org.springframework.version}</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>${org.springframework.boot.version}</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>bom</artifactId> <version>${aws-sdk.version}</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>org.junit</groupId> <artifactId>junit-bom</artifactId> <version>${junit-jupiter.version}</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-bom</artifactId> <version>${mockito.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!-- Secret managers --> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>secretsmanager</artifactId> </dependency> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>ssm</artifactId> </dependency> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>sts</artifactId> </dependency> <!-- Lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${lombok.version}</version> <scope>provided</scope> </dependency> <!-- Testing --> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-inline</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-junit-jupiter</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-params</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <finalName>bom-experiments</finalName> <sourceDirectory>${project.basedir}</sourceDirectory> <testSourceDirectory>${project.basedir}/src/test</testSourceDirectory> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>${maven-surefire-plugin.version}</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>${maven-compiler-plugin.version}</version> </plugin> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>${org.springframework.boot.version}</version> </plugin> </plugins> </build> </project>
疑问:是否误解了BOM概念?为何依赖已声明却无法生效?如何无父项目仅用BOM运行代码?
解决方案
问题根源
- BOM导入顺序与重复冲突:
spring-boot-dependencies本身已包含Spring Framework、JUnit、Mockito的版本管理,你先导入spring-framework-bom再导入它,会导致版本覆盖异常;同时额外导入的JUnit、Mockito BOM会和Spring Boot BOM的版本冲突,干扰依赖解析。 - 源码目录配置错误:
sourceDirectory设为项目根目录,Maven无法识别正确的主源码路径(默认应为src/main/java),测试代码路径配置也不完整,导致编译时找不到测试依赖对应的包。 - 测试依赖重复声明:
spring-boot-starter-test已包含junit-jupiter-api、mockito-junit-jupiter等依赖,重复声明会引发依赖冲突。
修复步骤
调整BOM导入逻辑:
- 将
spring-boot-dependencies放在dependencyManagement最前面,它覆盖了大部分常用依赖的版本管理,无需再单独导入spring-framework-bom、junit-bom、mockito-bom。 - 仅保留
aws-sdk-bom,因为Spring Boot BOM不包含AWS SDK版本。
- 将
修正源码目录配置:
- 删除自定义的
sourceDirectory和testSourceDirectory,让Maven使用默认目录结构:src/main/java(主源码)、src/test/java(测试源码);若源码结构特殊,需明确指定正确路径。
- 删除自定义的
精简测试依赖:
- 保留
spring-boot-starter-test,它已包含JUnit5、Mockito核心依赖;仅额外声明mockito-inline(因为Spring Boot默认用mockito-core)。
- 保留
修复后的核心pom.xml示例
<dependencyManagement> <dependencies> <!-- Spring Boot依赖BOM,包含Spring Framework、JUnit、Mockito等版本 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>${org.springframework.boot.version}</version> <type>pom</type> <scope>import</scope> </dependency> <!-- AWS SDK版本管理BOM --> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>bom</artifactId> <version>${aws-sdk.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <!-- 业务依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!-- AWS依赖 --> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>secretsmanager</artifactId> </dependency> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>ssm</artifactId> </dependency> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>sts</artifactId> </dependency> <!-- Lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${lombok.version}</version> <scope>provided</scope> </dependency> <!-- 测试依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> <!-- 额外的mockito-inline依赖 --> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-inline</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <finalName>bom-experiments</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>${maven-surefire-plugin.version}</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>${maven-compiler-plugin.version}</version> </plugin> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>${org.springframework.boot.version}</version> </plugin> </plugins> </build>
验证操作
执行Maven命令清理并重新构建:
mvn clean install
BOM核心概念澄清
BOM仅负责统一管理依赖版本,不会自动引入依赖。你仍需在dependencies中声明需要使用的依赖,BOM的作用是省去版本号编写,保证项目内依赖版本的一致性。
内容的提问来源于stack exchange,提问作者Dmytro Chasovskyi
相关产品推荐
相关产品推荐

