maven.config 的 --define 无法解析:选项和值各占一行
命令行能接受的 --define 写进 .mvn/maven.config 后可能被当成一个完整参数。Maven 3.9 起应按一参数一行组织,而不是复制 shell 引号。
终端里 mvn --define revision=1.0-SNAPSHOT --version 可以执行,把整段选项写进 .mvn/maven.config 后却报:
Unable to parse maven.config file options:
Unrecognized option: --define 'revision=1.0-SNAPSHOT'
Maven 3.9.0 起,这个文件按“一参数一行”处理。它不是 shell 脚本,不会先把一行中的选项和值按 shell 规则拆开,也不能靠加一对单引号得到同样效果。Maven 3.9.16 的具体问题涉及这条区别。
长选项和值分成两个参数
把 .mvn/maven.config 对应内容写成:
--define
revision=1.0-SNAPSHOT
--define 消费下一行作为值。没有 shell 参与时,这里的单引号可能成为值本身的一部分,所以不要照搬终端中为了防止分词而使用的引号。
需要包含空格的属性值时,也让整份值留在同一行,例如:
--define
message=hello world
一行一个参数正是为了保留这种值,不应再用通用空白分词脚本预处理整个文件。短写法 -Drevision=1.0-SNAPSHOT 本身是一个参数,也可以独占一行;不要把多组选项重新挤到一行。
不要混用旁边的 JVM 配置规则
.mvn/jvm.config 给 JVM 选项使用,.mvn/maven.config 给 Maven CLI 参数使用。两个文件相邻,不表示它们在所有版本中都有相同的分词方式。--add-opens 等 JVM 参数应放在适当入口,不能用它们的成功写法反推 Maven 参数格式。
保留现有配置的顺序与其他选项。若脚本或 CI 自动生成该文件,应一起修改生成逻辑,否则下次生成还会覆盖手工修正。检查时也要避免把包含密码的属性写入公开日志。
修改后先确认原 Maven 入口能越过参数解析,再验证相关属性在实际目标中取得预期值,尤其要检查是否意外保留了引号。--version 能运行,只证明参数可解析,不能证明完整构建和所有属性用途正确。
配置文件应保持文档说明的逐参数格式。更换 Maven 版本后也应检查包含空格的值,没有必要为这类参数解析错误清空依赖仓库或跳过项目模型检查。


