为啥 maven 不替换 maven-release-plugin 发布版本的环境变量?

Posted

技术标签:

【中文标题】为啥 maven 不替换 maven-release-plugin 发布版本的环境变量?【英文标题】:Why isn't maven replacing the environment variable for the maven-release-plugin release version?为什么 maven 不替换 maven-release-plugin 发布版本的环境变量? 【发布时间】:2013-07-12 11:52:30 【问题描述】:

我正在尝试将 maven-release-plugin 与一些环境变量一起使用,但是当我将环境变量用于发布版本时出现问题。 我正在执行:

mvn release:clean --batch-mode -Dtag=$env.tag -Dproject.rel.com.mycompany.project:project-root=$env.project.rel.com.mycompany.project:project-root -Dproject.dev.com.mycompany.project:project-root=$env.project.dev.com.mycompany.project:project-root release:prepare

我得到:

[ERROR] 未能执行目标 org.apache.maven.plugins:maven-release-plugin:2.4:prepare 项目项目根目录上的(默认-cli):解析版本错误, 无法确定下一个版本:无法解析版本字符串: "$env.project.rel.com.mycompany.project:project-root" -> [帮助 1]

如果我将$env.project.rel.com.mycompany.project:project-root 更改为特定版本,该命令将通过。

但正如你所看到的,我正在使用:

$env.tag  
$env.project.dev.com.mycompany.project:project-root  

没有问题。这是一个错误吗?还是我做错了什么?

补充说明

环境变量:

tag=2.55  
project.rel.com.mycompany.project:project-root=2.55  
project.dev.com.mycompany.project:project-root=2.56-SNAPSHOT  

我的 Maven 版本是:

C:\>mvn -version  
C:\>set MAVEN_OPTS=-Xmx1024m -XX:MaxPermSize=512m  
Apache Maven 3.0.4 (r1232337; 2012-01-17 09:44:56+0100)  
Maven home: C:\Users\John\Documents\apache-maven-3.0.4-bin  
Java version: 1.6.0_25, vendor: Sun Microsystems Inc.  
Java home: C:\JDK\jdk1.6.0_25\jre  
Default locale: en_US, platform encoding: Cp1252  
OS name: "windows 7", version: "6.1", arch: "amd64", family: "windows"  

【问题讨论】:

【参考方案1】:

您必须使用 arguments 属性:http://maven.apache.org/maven-release/maven-release-plugin/prepare-mojo.html#arguments

因此,在您的上下文中,您的 cmd 行将如下所示(也请注意双引号):

mvn release:clean --batch-mode release:prepare "-Darguments=-Dtag=$env.tag -Dproject.rel.com.mycompany.project:project-root=$env.project.rel.com.mycompany.project:project-root -Dproject.dev.com.mycompany.project:project-root=$env.project.dev.com.mycompany.project:project-root"

此外,如果我没记错的话,令牌 $env.X 的使用需要使用大写的属性名称(待验证)

【讨论】:

1.这只给出与 mvn release:clean --batch-mode release:prepare 2 相同的结果。“...in大写...”为什么 $env.tag 工作呢? 现在已经完整阅读了您的原始帖子,env.tag 已正确解析,因为您已在环境中正确设置了属性“tag”。其他的不是因为你用“env”在你的环境中设置了它们。 prefix 从环境属性中删除此前缀,但将其保留在命令行中。希望这能解决您的问题。 ““env.”前缀是我无意中从命令字符串中复制的。我对帖子进行了编辑。所以同样的问题又出现了。顺便说一句,谢谢你的尝试;) 我明白了,不用担心。奇怪的是它不起作用,我使用环境变量从来没有任何问题,但我只使用 maven 2。那些project.rel.com.mycompany.project:project-root 是什么?它们是在你的 pom 中定义的属性吗?我不确定在属性名称中是否允许使用冒号“:”? "我不确定在属性名称中是否允许使用冒号 ":" ?"和以前一样:) project.dev.com.mycompany.project:project-root=2.56-SNAPSHOT 环境变量有效。只有释放变量没有。它可能是某种只出现在这个星座(windows 版本、maven 和 java 版本)的错误【参考方案2】:

它不起作用,因为发布插件清除了环境[1]。我怀疑它是否已记录在案[2],我通过查看源代码发现了这一点。 Farid 的回答是一个很好的解决方法 - 它通过未清除的 java 属性传递环境值。

我会简单地评论 Farid 的回答,但我认为我不够闪亮。

    为什么?? 经典的 maven。

【讨论】:

以上是关于为啥 maven 不替换 maven-release-plugin 发布版本的环境变量?的主要内容,如果未能解决你的问题,请参考以下文章

关于maven的问题,不知道为啥Eclipse导入maven工程以后报错

为啥每次都加载新的 xib 文件?为啥不替换前一个?

maven为啥更新不下来新jar包?

为啥maven更新要删除文件

为啥maven在构建过程中不复制属性文件?

为啥 HyperLinkField 替换某些 URL 中的字段而不替换其他 URL?