Maven clean 报错与 Maven Profile 机制总结

1. 文档背景

本文用于总结在 IntelliJ IDEA 中对 jaf-java-cloud 项目执行 Maven clean 时出现的 POM 解析失败问题,并说明 Maven 侧边栏中 Profilesboot3boot2jdk-21 等配置项的来源、作用、生效位置和推荐配置方式。

涉及项目与环境如下:

项目/工具 路径/版本
工作目录 E:\work2026\workspace
后端项目 E:\work2026\workspace\jaf-java-cloud
公共源码参考 E:\work2026\workspace\jnpf-common
JDK D:\Program Files\Java\jdk-21.0.10
Maven E:\work2026\dev-tools\maven\apache-maven-3.9.9
Maven settings E:\work2026\dev-tools\maven\apache-maven-3.9.9\conf\settings.xml
本地 Maven 仓库 D:\api\maven

本次只做问题分析和配置说明,未修改项目代码。


2. 原始报错现象

在 IDEA 中执行 Maven clean 时,Maven 命令中包含类似参数:

powershell 复制代码
-P !boot3

随后出现如下典型错误:

text 复制代码
Non-resolvable import POM: The following artifacts could not be resolved:
org.seleniumhq.selenium:selenium-bom:pom:${selenium.version}
text 复制代码
Non-resolvable import POM: The following artifacts could not be resolved:
org.springframework.cloud:spring-cloud-dependencies:pom:${spring-cloud.version}
text 复制代码
Non-resolvable import POM: The following artifacts could not be resolved:
com.alibaba.cloud:spring-cloud-alibaba-dependencies:pom:${spring-cloud-alibaba.version}
text 复制代码
Non-resolvable import POM: The following artifacts could not be resolved:
org.springframework.boot:spring-boot-dependencies:pom:${spring-boot.version}

同时还出现:

text 复制代码
'dependencies.dependency.version' for org.springframework.cloud:spring-cloud-starter-bootstrap:jar is missing.
text 复制代码
'dependencies.dependency.version' for org.springframework.cloud:spring-cloud-starter-loadbalancer:jar is missing.
text 复制代码
'build.plugins.plugin.version' for org.springframework.boot:spring-boot-maven-plugin must be a valid version but is '${spring-boot.version}'.

这些错误的共同特征是:Maven 没有把 ${spring-boot.version}${spring-cloud.version}${spring-cloud-alibaba.version}${selenium.version} 等变量解析成实际版本号,而是把它们当成字面量使用。


3. 直接结论

根因不是 Nexus 仓库中缺少 Spring Boot、Spring Cloud 或 Selenium 的 BOM 文件,而是 Maven Profile 没有正确激活。

具体原因是:

  1. 当前项目使用 JDK 21。
  2. JDK 21 环境下,项目需要启用 boot3 Profile。
  3. 但 Maven 执行命令中出现了 -P !boot3
  4. !boot3 的含义是显式禁用 boot3 Profile。
  5. boot3 被禁用后,Spring Boot、Spring Cloud、Selenium 等关键版本属性没有被定义。
  6. Maven 在解析 BOM 依赖时无法替换 ${...} 变量,于是把变量文本当成版本号去下载。
  7. Nexus 收到带 ${...} 的非法路径后返回 400 Invalid repository path

因此,核心修复方式是:不要禁用 boot3,而是显式启用 boot3


4. Maven Profile 是什么

Maven Profile 是 Maven 提供的一种"条件化配置片段"机制。

可以把 Profile 理解为一组可开关的 Maven 配置。当某个 Profile 被激活后,它里面定义的配置会被合并到 Maven 最终构建模型中,也就是合并进 effective POM。

Profile 可以包含很多配置,例如:

  • <properties>:定义版本号、编译参数等属性。
  • <dependencies>:增加或调整依赖。
  • <dependencyManagement>:管理依赖版本。
  • <build>:调整插件、资源、编译配置。
  • <repositories>:配置仓库地址。
  • <pluginRepositories>:配置插件仓库。

Profile 的常见用途:

用途 示例
按 JDK 切换配置 JDK 8 使用 boot2,JDK 17+ 使用 boot3
按环境切换配置 dev、test、prod
按系统切换配置 Windows、Linux、macOS
按构建目标切换 普通包、Docker 包、发布包
按依赖体系切换 Spring Boot 2 与 Spring Boot 3

5. IDEA Maven 侧边栏中的 Profiles 从哪来

IDEA Maven 侧边栏中的 Profiles 不是 IDEA 自己发明的配置,而是 IDEA 扫描 Maven 项目和 Maven settings 后展示出来的 Maven Profile。

来源主要有三类:

5.1 来自项目 POM 或父 POM

boot3boot2 主要来自项目 POM、父 POM 或本地 Maven 仓库中的父 POM。

本次问题中,关键父 POM 是:

text 复制代码
D:\api\maven\com\jnpf\jnpf-dependencies\5.2.0-RELEASE\jnpf-dependencies-5.2.0-RELEASE.pom

其中定义了:

xml 复制代码
<profiles>
    <profile>
        <id>boot3</id>
        <activation>
            <jdk>[17,)</jdk>
        </activation>
        ...
    </profile>

    <profile>
        <id>boot2</id>
        <activation>
            <jdk>(,17)</jdk>
        </activation>
        ...
    </profile>
</profiles>

含义如下:

Profile 自动激活条件 适用场景
boot3 JDK 17 及以上 Spring Boot 3 / Spring Cloud 2025 体系
boot2 JDK 小于 17 Spring Boot 2 / Spring Cloud 2021 体系

当前环境是 JDK 21,所以应使用 boot3,不应使用 boot2

5.2 来自 Maven settings

jdk-21 来自 Maven settings 文件:

text 复制代码
E:\work2026\dev-tools\maven\apache-maven-3.9.9\conf\settings.xml

其中配置了:

xml 复制代码
<profile>
    <id>jdk-21</id>
    <activation>
        <activeByDefault>true</activeByDefault>
    </activation>
    <properties>
        <maven.compiler.source>21</maven.compiler.source>
        <maven.compiler.target>21</maven.compiler.target>
    </properties>
</profile>

它的作用是为 Maven 构建提供 Java 编译参数:

xml 复制代码
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>

也就是说,jdk-21 主要控制编译 source/target 级别。

5.3 来自用户级 settings

Maven 还会读取用户级 settings:

text 复制代码
%USERPROFILE%\.m2\settings.xml

如果其中也定义了 Profile,IDEA Maven 侧边栏中同样可能展示出来。


6. boot3 的作用

boot3 是本次问题的关键 Profile。

它的核心作用是为 Spring Boot 3 技术栈提供一整套版本属性和依赖管理。

jnpf-dependenciesboot3 Profile 中,可以看到类似版本定义:

xml 复制代码
<spring-boot.version>3.5.3</spring-boot.version>
<spring-cloud.version>2025.0.0</spring-cloud.version>
<spring-cloud-alibaba.version>2023.0.3.3</spring-cloud-alibaba.version>
<selenium.version>4.21.0</selenium.version>

这些属性被上方的 BOM import 使用,例如:

xml 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-dependencies</artifactId>
    <version>${spring-boot.version}</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>
xml 复制代码
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-dependencies</artifactId>
    <version>${spring-cloud.version}</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>
xml 复制代码
<dependency>
    <groupId>org.seleniumhq.selenium</groupId>
    <artifactId>selenium-bom</artifactId>
    <version>${selenium.version}</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>

如果 boot3 不生效,上述 ${...} 变量就没有值,Maven 就无法正确导入 BOM。


7. boot2 的作用

boot2 是另一套 Spring Boot 2 技术栈配置。

它一般包含类似版本:

xml 复制代码
<spring-boot.version>2.7.18</spring-boot.version>
<spring-cloud.version>2021.0.9</spring-cloud.version>
<spring-cloud-alibaba.version>2021.0.6.2</spring-cloud-alibaba.version>
<selenium.version>4.13.0</selenium.version>

它的自动激活条件是:

xml 复制代码
<jdk>(,17)</jdk>

意思是 JDK 小于 17 时激活。

当前环境是 JDK 21,因此不应启用 boot2。如果同时启用 boot2boot3,可能出现属性覆盖、依赖版本冲突、Spring Boot 2/3 混用等问题。


8. jdk-21 的作用

jdk-21 来自 Maven settings,主要用于设置 Maven 编译参数。

它并不是 Spring Boot 3 依赖体系的核心 Profile,而是编译环境相关 Profile。

作用如下:

xml 复制代码
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>

含义:

属性 作用
maven.compiler.source Java 源码语言级别
maven.compiler.target 编译输出的 class 目标版本

对于当前项目,建议勾选 jdk-21,以保持 IDEA Maven 面板、命令行 Maven 和 JDK 21 环境一致。

不过本次报错的直接原因不是 jdk-21,而是 boot3 被禁用。


9. Profile 在哪里起作用

Maven Profile 在 Maven 构建模型阶段生效。

执行 Maven 命令时,Maven 会先完成以下步骤:

  1. 读取当前项目 pom.xml
  2. 读取父 POM。
  3. 读取 Maven settings。
  4. 计算哪些 Profile 被激活。
  5. 将激活的 Profile 合并到 Maven 模型中。
  6. 生成 effective POM。
  7. 再执行 cleancompilepackage 等生命周期。

所以 Profile 会影响:

  • IDEA 导入 Maven 项目时的依赖解析。
  • IDEA Maven 侧边栏执行 cleancompilepackage
  • 命令行执行 mvn cleanmvn package
  • Maven 依赖树。
  • Maven 插件版本。
  • Java 编译参数。
  • 子模块依赖版本。
  • BOM import 是否能成功解析。

本次即使只是执行 clean,Maven 也需要先读取并解析 POM。POM 模型解析失败时,clean 还没真正开始执行就会失败。


10. 为什么 clean 也会触发依赖解析错误

很多人会认为 clean 只是删除 target 目录,不应该解析依赖。

但 Maven 执行任何生命周期之前,都需要先构建项目模型。

项目模型包括:

  • 父 POM。
  • dependencyManagement。
  • pluginManagement。
  • properties。
  • profiles。
  • modules。
  • dependencies。

如果这些模型无法解析,Maven 不知道当前项目是什么结构,也不知道插件和依赖版本,因此即使执行 clean 也会失败。

本次失败发生在项目模型解析阶段,而不是发生在实际清理 target 目录阶段。


11. -P 参数的含义

Maven 使用 -P 参数启用或禁用 Profile。

11.1 启用 Profile

powershell 复制代码
mvn -Pboot3 clean

表示启用 boot3

启用多个 Profile:

powershell 复制代码
mvn -Pboot3,jdk-21 clean

11.2 禁用 Profile

powershell 复制代码
mvn -P!boot3 clean

表示禁用 boot3

也可能写成:

powershell 复制代码
mvn -P !boot3 clean

在 IDEA 生成的命令中,看到 -P !boot3 就表示 Maven 被要求禁用 boot3

这正是本次报错的关键触发点。


12. IDEA 中应该如何勾选

当前项目使用 JDK 21,推荐 IDEA Maven 侧边栏 Profiles 勾选如下:

Profile 是否勾选 原因
boot3 JDK 21 对应 Spring Boot 3 体系,必须启用
jdk-21 保持编译参数为 Java 21
boot2 JDK 21 不应使用 Spring Boot 2 体系

也就是说,推荐状态是:

text 复制代码
[ ] boot2
[x] boot3
[x] jdk-21

重点检查:Maven 执行命令中不能再出现:

text 复制代码
-P !boot3

13. IDEA 中还需要检查哪些位置

除了 Maven 侧边栏中的 Profiles,还建议检查以下位置。

13.1 Maven Run Configuration

路径大致是:

text 复制代码
Run/Debug Configurations -> Maven -> 对应 clean 配置 -> Profiles

确保其中不是:

text 复制代码
!boot3

建议改为:

text 复制代码
boot3,jdk-21

或者至少:

text 复制代码
boot3

13.2 IDEA Maven Runner JDK

路径大致是:

text 复制代码
Settings -> Build, Execution, Deployment -> Build Tools -> Maven -> Runner -> JRE

建议选择:

text 复制代码
D:\Program Files\Java\jdk-21.0.10

或者选择 Project JDK,但 Project JDK 本身应配置为 JDK 21。

13.3 IDEA Maven Importing JDK

路径大致是:

text 复制代码
Settings -> Build, Execution, Deployment -> Build Tools -> Maven -> Importing -> JDK for importer

建议也使用 JDK 21。

13.4 Maven settings 文件

确认 IDEA 使用的 settings 是:

text 复制代码
E:\work2026\dev-tools\maven\apache-maven-3.9.9\conf\settings.xml

因为 jdk-21 Profile 定义在这个 settings 文件中。


14. 除了 IDEA 侧边栏,还可以在哪里配置 Profile

14.1 命令行中配置

执行 Maven 时直接指定:

powershell 复制代码
E:\work2026\dev-tools\maven\apache-maven-3.9.9\bin\mvn.cmd -Pboot3,jdk-21 clean -f E:\work2026\workspace\jaf-java-cloud\pom.xml

带 settings 和本地仓库参数的完整示例:

powershell 复制代码
E:\work2026\dev-tools\maven\apache-maven-3.9.9\bin\mvn.cmd `
  -Pboot3,jdk-21 `
  -s E:\work2026\dev-tools\maven\apache-maven-3.9.9\conf\settings.xml `
  -Dmaven.repo.local=D:\api\maven `
  clean `
  -f E:\work2026\workspace\jaf-java-cloud\pom.xml

14.2 项目 POM 中配置自动激活

pom.xml 中可以通过 <activation> 自动激活 Profile:

xml 复制代码
<profile>
    <id>boot3</id>
    <activation>
        <jdk>[17,)</jdk>
    </activation>
</profile>

这表示 JDK 17 及以上自动激活。

当前父 POM 中已经有类似配置。

14.3 Maven settings 中配置默认激活

可以在 settings 中配置:

xml 复制代码
<activeProfiles>
    <activeProfile>jdk-21</activeProfile>
</activeProfiles>

或者在具体 profile 中配置:

xml 复制代码
<activation>
    <activeByDefault>true</activeByDefault>
</activation>

当前 jdk-21 就是通过 activeByDefault 默认激活。

14.4 用户级 settings.xml

用户级 settings 路径:

text 复制代码
%USERPROFILE%\.m2\settings.xml

可以在这里定义和激活个人本地环境相关 Profile。

14.5 Maven 安装级 settings.xml

Maven 安装级 settings 路径通常是:

text 复制代码
E:\work2026\dev-tools\maven\apache-maven-3.9.9\conf\settings.xml

但你本次使用的是:

text 复制代码
E:\work2026\dev-tools\maven\apache-maven-3.9.9\conf\settings.xml

因此实际生效要以 -s 指定的 settings 文件为准。

14.6 项目级 .mvn/maven.config

项目下可以创建:

text 复制代码
jaf-java-cloud\.mvn\maven.config

里面可以写默认 Maven 参数,例如:

text 复制代码
-Pboot3,jdk-21
-s E:\work2026\dev-tools\maven\apache-maven-3.9.9\conf\settings.xml
-Dmaven.repo.local=D:\api\maven

不过是否要新增 .mvn/maven.config 需要团队统一决定,因为它会影响所有使用该项目构建的人。

本次不建议擅自新增该文件。


15. 推荐修复方案

15.1 IDEA 中推荐操作

  1. 打开 IDEA Maven 侧边栏。
  2. 找到 Profiles
  3. 勾选 boot3
  4. 勾选 jdk-21
  5. 不勾选 boot2
  6. 检查 Maven Run Configuration 中没有 !boot3
  7. 重新 Reload Maven Project。
  8. 再执行 Maven clean

15.2 命令行推荐操作

推荐命令:

powershell 复制代码
E:\work2026\dev-tools\maven\apache-maven-3.9.9\bin\mvn.cmd `
  -Pboot3,jdk-21 `
  -s E:\work2026\dev-tools\maven\apache-maven-3.9.9\conf\settings.xml `
  -Dmaven.repo.local=D:\api\maven `
  clean `
  -f E:\work2026\workspace\jaf-java-cloud\pom.xml

如果 jdk-21 已经默认激活,也可以只显式指定:

powershell 复制代码
E:\work2026\dev-tools\maven\apache-maven-3.9.9\bin\mvn.cmd `
  -Pboot3 `
  -s E:\work2026\dev-tools\maven\apache-maven-3.9.9\conf\settings.xml `
  -Dmaven.repo.local=D:\api\maven `
  clean `
  -f E:\work2026\workspace\jaf-java-cloud\pom.xml

16. 验证命令

16.1 查看当前激活的 Profile

powershell 复制代码
E:\work2026\dev-tools\maven\apache-maven-3.9.9\bin\mvn.cmd `
  -Pboot3,jdk-21 `
  -s E:\work2026\dev-tools\maven\apache-maven-3.9.9\conf\settings.xml `
  -Dmaven.repo.local=D:\api\maven `
  help:active-profiles `
  -f E:\work2026\workspace\jaf-java-cloud\pom.xml

预期应看到 boot3jdk-21 激活,不应看到 boot2 激活。

16.2 验证 effective POM 中版本是否解析

powershell 复制代码
E:\work2026\dev-tools\maven\apache-maven-3.9.9\bin\mvn.cmd `
  -Pboot3,jdk-21 `
  -s E:\work2026\dev-tools\maven\apache-maven-3.9.9\conf\settings.xml `
  -Dmaven.repo.local=D:\api\maven `
  help:effective-pom `
  -f E:\work2026\workspace\jaf-java-cloud\pom.xml

检查输出中不应再出现:

text 复制代码
${spring-boot.version}
${spring-cloud.version}
${spring-cloud-alibaba.version}
${selenium.version}

而应出现实际版本号,例如:

text 复制代码
3.5.3
2025.0.0
2023.0.3.3
4.21.0

16.3 执行 clean

powershell 复制代码
E:\work2026\dev-tools\maven\apache-maven-3.9.9\bin\mvn.cmd `
  -Pboot3,jdk-21 `
  -s E:\work2026\dev-tools\maven\apache-maven-3.9.9\conf\settings.xml `
  -Dmaven.repo.local=D:\api\maven `
  clean `
  -f E:\work2026\workspace\jaf-java-cloud\pom.xml

本地验证中,使用 -P!boot3 可以复现报错;使用 -Pboot3 后,mvn clean 可以正常通过。


17. 排查思路总结

本次排查遵循如下思路:

  1. 先看错误中是否有 ${...} 未解析变量。
  2. 发现 Maven 正在尝试下载 selenium-bom-${selenium.version}.pom 这类非法路径。
  3. 判断不是普通依赖缺失,而是 Maven 属性未生效。
  4. 根据属性名称定位到 jnpf-dependencies 父 POM。
  5. 发现这些属性定义在 boot3 / boot2 Profile 中。
  6. 根据 JDK 21 判断应激活 boot3
  7. 发现原始命令中存在 -P !boot3,明确禁用了 boot3
  8. 使用 -P!boot3 复现问题。
  9. 使用 -Pboot3 验证 clean 成功。
  10. 得出最终结论:IDEA Maven Profile 配置错误导致 boot3 被禁用。

18. 常见误区

18.1 误以为是 Nexus 仓库缺包

报错中虽然出现了 Could not transfer artifact,但真正异常的点是版本号仍然是 ${spring-boot.version}

正常 Maven 下载路径应类似:

text 复制代码
org/springframework/boot/spring-boot-dependencies/3.5.3/spring-boot-dependencies-3.5.3.pom

异常路径却是:

text 复制代码
org/springframework/boot/spring-boot-dependencies/${spring-boot.version}/spring-boot-dependencies-${spring-boot.version}.pom

所以根因是 Profile 未生效,不是仓库缺包。

18.2 误以为 clean 不需要解析 POM

clean 虽然只是生命周期中的清理阶段,但 Maven 在执行前仍要读取完整项目模型。

POM 模型解析失败时,clean 会直接失败。

18.3 误以为勾选 jdk-21 就等于启用了 boot3

jdk-21boot3 是两个不同 Profile。

  • jdk-21:主要设置编译 source/target。
  • boot3:主要设置 Spring Boot 3 依赖体系版本。

jdk-21 不能替代 boot3

18.4 误以为 IDEA 侧边栏勾选一定覆盖 Run Configuration

IDEA 中 Maven 侧边栏 Profiles 和具体 Maven Run Configuration 都可能影响最终执行命令。

如果 Run Configuration 中写了 !boot3,仍可能导致执行命令禁用 boot3

因此必须检查最终执行命令。


19. 最终建议

当前项目建议统一采用以下 Maven Profile 组合:

text 复制代码
boot3,jdk-21

在 IDEA Maven 侧边栏中:

text 复制代码
[ ] boot2
[x] boot3
[x] jdk-21

不要在任何 Maven 命令、Run Configuration、.mvn/maven.config 或其他 Maven 参数配置中出现:

text 复制代码
!boot3

如果后续团队需要统一构建方式,建议在团队层面明确:

  1. 开发 JDK 统一使用 JDK 21。
  2. IDEA Maven Runner JDK 统一使用 JDK 21。
  3. Maven settings 统一使用 settings.xml
  4. Maven Profile 统一启用 boot3,jdk-21
  5. 不启用 boot2
  6. 不提交未经确认的 .mvn/maven.config,避免影响其他开发人员。

20. 一句话总结

本次 Maven clean 失败的本质原因是 IDEA 执行 Maven 时带了 -P !boot3,导致 JDK 21 环境下本应启用的 boot3 Profile 被禁用,Spring Boot / Spring Cloud / Selenium 的版本属性没有被解析,最终 Maven 使用 ${...} 字面量访问 Nexus 并报 400 Invalid repository path。正确做法是在 IDEA Maven Profiles 中勾选 boot3jdk-21,不要勾选 boot2,并确保最终 Maven 命令中不再出现 !boot3

相关推荐
逍遥德1 小时前
Java编程高频的“技术点”-03:“下划线命名”参数,后端用“驼峰命名“接收
java·后端·springboot
qq_366086222 小时前
测试接口传参数时,放在Header和Body中后台接收参数的区别
java·开发语言·前端
Jun6262 小时前
QT(8)-线程锁
java·开发语言
biubiubiu07062 小时前
SpringBoot 3.5.4 整合Quartz 定时任务
java·spring boot·spring
mifengxing2 小时前
LeetCode热题100——字母异位词分组
java·算法·leetcode·职场和发展·哈希表·hot100
微三云、小叶2 小时前
排队免单系统底层设计:四种分配算法拆解,无预支资金的合规营销架构方案
java·前端·软件开发·商业模式·本地生活·商业思维
就叫_这个吧2 小时前
Java+MySQL+Mybatis+Junit4实现学生信息管理系统
java·mysql·mybatis
乐之者v2 小时前
xxl-job添加执行器
java
可乐ea3 小时前
【知识获取与分享社区项目 | 项目日记第 19 天】基于 Elasticsearch 实现关键词检索与业务权重排序
java·大数据·spring boot·mysql·elasticsearch·搜索引擎·全文检索