1. 文档背景
本文用于总结在 IntelliJ IDEA 中对 jaf-java-cloud 项目执行 Maven clean 时出现的 POM 解析失败问题,并说明 Maven 侧边栏中 Profiles、boot3、boot2、jdk-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 没有正确激活。
具体原因是:
- 当前项目使用 JDK 21。
- JDK 21 环境下,项目需要启用
boot3Profile。 - 但 Maven 执行命令中出现了
-P !boot3。 !boot3的含义是显式禁用boot3Profile。boot3被禁用后,Spring Boot、Spring Cloud、Selenium 等关键版本属性没有被定义。- Maven 在解析 BOM 依赖时无法替换
${...}变量,于是把变量文本当成版本号去下载。 - 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
boot3、boot2 主要来自项目 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-dependencies 的 boot3 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。如果同时启用 boot2 和 boot3,可能出现属性覆盖、依赖版本冲突、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 会先完成以下步骤:
- 读取当前项目
pom.xml。 - 读取父 POM。
- 读取 Maven settings。
- 计算哪些 Profile 被激活。
- 将激活的 Profile 合并到 Maven 模型中。
- 生成 effective POM。
- 再执行
clean、compile、package等生命周期。
所以 Profile 会影响:
- IDEA 导入 Maven 项目时的依赖解析。
- IDEA Maven 侧边栏执行
clean、compile、package。 - 命令行执行
mvn clean、mvn 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 中推荐操作
- 打开 IDEA Maven 侧边栏。
- 找到
Profiles。 - 勾选
boot3。 - 勾选
jdk-21。 - 不勾选
boot2。 - 检查 Maven Run Configuration 中没有
!boot3。 - 重新 Reload Maven Project。
- 再执行 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
预期应看到 boot3 和 jdk-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. 排查思路总结
本次排查遵循如下思路:
- 先看错误中是否有
${...}未解析变量。 - 发现 Maven 正在尝试下载
selenium-bom-${selenium.version}.pom这类非法路径。 - 判断不是普通依赖缺失,而是 Maven 属性未生效。
- 根据属性名称定位到
jnpf-dependencies父 POM。 - 发现这些属性定义在
boot3/boot2Profile 中。 - 根据 JDK 21 判断应激活
boot3。 - 发现原始命令中存在
-P !boot3,明确禁用了boot3。 - 使用
-P!boot3复现问题。 - 使用
-Pboot3验证 clean 成功。 - 得出最终结论: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-21 和 boot3 是两个不同 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
如果后续团队需要统一构建方式,建议在团队层面明确:
- 开发 JDK 统一使用 JDK 21。
- IDEA Maven Runner JDK 统一使用 JDK 21。
- Maven settings 统一使用
settings.xml。 - Maven Profile 统一启用
boot3,jdk-21。 - 不启用
boot2。 - 不提交未经确认的
.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 中勾选 boot3 和 jdk-21,不要勾选 boot2,并确保最终 Maven 命令中不再出现 !boot3。