‘version‘ must be a constant version but is ‘${revision}‘

文章目录

Maven ${revision} 构建错误修复说明

问题现象

执行 Maven 命令时,构建在读取 pom.xml 阶段失败:

text 复制代码
'version' must be a constant version but is '${revision}'

出错位置是 pom.xml 中的项目版本:

xml 复制代码
<version>${revision}</version>

解决问题的关键步骤

  1. 检查 Maven 报错信息,确认失败发生在解析项目版本号阶段。
  2. 在项目中搜索 revision,发现 pom.xml 使用了 ${revision},但没有定义对应的 <revision> 属性。
  3. 用临时命令参数 -Drevision=0.0.1-SNAPSHOT 验证判断,Maven 可以越过原来的版本号错误,说明根因就是 revision 未定义。
  4. 在 pom.xml 的 <properties> 中加入默认版本号:
xml 复制代码
<revision>0.0.1-SNAPSHOT</revision>
  1. 重新执行 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
相关推荐
Knight_AL11 小时前
Java 文件下载时文件名中的 `#` 被转换成 `%23`?一次 URL 编码与解码问题排查
java·开发语言
利威尔xu11 小时前
Go IM 源码实战(14):本地缓存快 3000 倍,失效却难 10 倍
后端·缓存·微服务·面试·golang
逃逸线LOF12 小时前
Ribbon负载均衡原理(Irule组件、源码分析)
后端·spring cloud·ribbon
砚底藏山河12 小时前
python量化自定义周期 K 线合成
java·开发语言·数据库·python·金融
慢云智慧空间12 小时前
从设备智能到空间理解,空间智能终端解决方案商如何重新定义行业标准
后端
利威尔xu12 小时前
Go IM 源码实战(13):30 个会话只有 2 个红点,未读数错在三条路径
redis·后端·微服务·面试·golang
猿究院_夏燊13 小时前
MySQL 的四种隔离级别
java·数据库·mysql
薛定谔的猫-菜鸟程序员13 小时前
软件架构设计师开发资料大全(从入门到精通)
后端·python·系统架构·flask·架构设计师
码流子13 小时前
移动收费怎么做?手持终端+App+收费中心的架构实践
java·开发语言·架构
霸道流氓气质14 小时前
AI 流式对话与实时聊天平台:SSE 解码竞态、有状态会话隔离与背压取消的 Vue3 + Spring AI 生产级实战
java·人工智能·spring