文章目录
Maven ${revision} 构建错误修复说明
问题现象
执行 Maven 命令时,构建在读取 pom.xml 阶段失败:
text
'version' must be a constant version but is '${revision}'
出错位置是 pom.xml 中的项目版本:
xml
<version>${revision}</version>
解决问题的关键步骤
- 检查 Maven 报错信息,确认失败发生在解析项目版本号阶段。
- 在项目中搜索
revision,发现pom.xml使用了${revision},但没有定义对应的<revision>属性。 - 用临时命令参数
-Drevision=0.0.1-SNAPSHOT验证判断,Maven 可以越过原来的版本号错误,说明根因就是revision未定义。 - 在
pom.xml的<properties>中加入默认版本号:
xml
<revision>0.0.1-SNAPSHOT</revision>
- 重新执行 Maven
clean,构建成功。
原理说明
${revision} 是 Maven 的 CI-friendly version 写法,常用于让项目版本号可以通过命令行、CI/CD 或统一配置动态传入。
例如:
xml
<version>${revision}</version>
这表示项目版本不是直接写死在 <version> 里,而是从 Maven 属性 revision 中读取。
Maven 属性可以来自几个地方:
pom.xml的<properties>。- 命令行参数,例如
-Drevision=0.0.1-SNAPSHOT。 - 父 POM 或 profile 中的属性。
- CI/CD 环境注入的参数。
本项目当前只有一个独立的 pom.xml,里面使用了 ${revision},但是没有定义:
xml
<properties>
<revision>0.0.1-SNAPSHOT</revision>
</properties>
也没有在 Maven 命令中传入:
bash
mvn -Drevision=0.0.1-SNAPSHOT clean
所以 Maven 在解析项目模型时无法把 ${revision} 替换成真实版本号,最终报错。
为什么这样修复
把 revision 写入 pom.xml 的 <properties> 后,项目本身就有了默认版本号,不依赖 IDE、命令行或 CI 环境额外传参。
这样既保留了 ${revision} 的灵活性,也让本地直接执行 Maven 命令可以正常工作。
后续如果需要在 CI/CD 中覆盖版本号,仍然可以使用:
bash
mvn -Drevision=1.0.0 clean package
命令行传入的 -Drevision=... 会覆盖 pom.xml 中的默认值。
本次修改
修改文件:
text
xiaoha-ai-robot-springboot-14.7节/xiaoha-ai-robot-springboot/pom.xml
新增内容:
xml
<revision>0.0.1-SNAPSHOT</revision>
验证结果:
text
BUILD SUCCESS