【问题标题】:maven override project.version from command linemaven 从命令行覆盖 project.version
【发布时间】:2013-08-07 10:00:10
【问题描述】:

我想知道是否可以通过命令行覆盖 maven 中的 project.version/version 变量?

以下不起作用:

mvn deploy -Dversion=1.0-test-SNAPSHOT  
mvn deploy -Dproject.version=1.0-test-SNAPSHOT  

提前感谢您的帮助!

我的 pom.xml 是:

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>just.another.company.name</groupId>
    <artifactId>my-pom</artifactId>
    <version>1.3-SNAPSHOT</version>
    <name>My Module</name>
    <packaging>jar</packaging>
    <description>POM Project for My Module</description>
</project>

【问题讨论】:

  • 为什么不试试 hello world 项目?
  • @mebada,如果我不在不同的项目上多次尝试,我不会问。如果您知道,为什么不提供解决方案?
  • 指的是你的pom,只是你不能这样做...... project.version应该是静态的

标签: maven


【解决方案1】:

只是你不能覆盖project.version。试试:

mvn versions:set -DnewVersion=<version>

通常,我首先更新 parentPom

mvn versions:set -DnewVersion=1.0.3-SNAPSHOT

如果父pom包含所有子项目就足够了,否则你需要去一个包含所有子项目的超级项目并执行

mvn versions:update-child-modules

如果 parentPom 存在于相对路径中,前面两个步骤就足够了,否则你需要安装新版本的 parentPom 项目

mvn install

如果您没有模块依赖于另一个模块,这通常就足够了。如果你这样做,将其版本声明为 project.version 这样的,它将自动反映

<version>${project.version}</version>

检查maven Versions Plugin docs

【讨论】:

  • 作为一个魅力,但我没有提到的一件事......其中一个模块依赖于另一个模块的工件,所以我也需要覆盖它。刚才提到了,抱歉。
  • 突然间,这不适用于竹连续集成系统。没有时间调查它,只是提供事实。根据日志,它在以下之后挂起:Searching for local aggregator root... 所以我认为它找不到父 pom...
  • 使用versions:commit 删除de POM 备份:mvn versions:set -DnewVersion=1.0.3 versions:commit
  • @mebada:这工作完美无缺 阿古斯蒂:你是对的。 mvn versions:commit 是删除版本备份 pom 文件所必需的。
  • 这对我没有用,因为它每次都改变 pom.xml 和我的 Docker 构建重建,即使没有任何改变。
【解决方案2】:

在 Maven 3.5+ 中,如果您将以下内容放入您的 pom.xml 中

<version>${revision}</version>
...
<properties>
    <revision>1.0.0-SNAPSHOT</revision>
</properties>

它默认使用 1.0.0-SNAPSHOT,但你可以在命令行上覆盖它:

mvn -Drevision=2.0.0-SNAPSHOT clean package

显然,这仅在占位符属性称为 revision 时才有效(您也可以在您的版本中使用 changelistsha1 占位符)。

https://maven.apache.org/maven-ci-friendly.html

【讨论】:

  • 在使用 ${revision} 的多模块项目中,即使在命令行上显式传递修订版,我也无法单独构建模块。错误说,构建找不到版本 ${revision} 的依赖项
  • 嗯,根据maven.apache.org/maven-ci-friendly.html#dependencies,您必须在依赖项中使用${project.version} 而不是${revision},并将flatten-maven-plugin 添加到父pom,但我什至无法让它工作当我这样做的时候。
  • 注意名称必须是“revision”。如果您使用列出的 3 个以外的任何名称,mvn 将打印警告,当 应该是一个常量时正在使用表达式,并威胁到将来可能不支持此类“格式错误”的项目。
【解决方案3】:

是的,您可以通过从命令行传递所需的变量来覆盖项目版本。

确保您使用的是 pom.xml 中的变量

例如:

mvn deploy -Dversion=1.0-test-SNAPSHOT 

pom.xml

<version>${version}</version>

这应该在运行时被选中。如果这种方法不起作用,您能否在pom.xml 中说明您是如何使用它们的?

【讨论】:

  • 实际上,由于某种原因,这对我不起作用。请参考我上面的 pom.xml。
  • 只有当你有 ${version} 占位符......呃......就位时它才有效。
  • 我面临同样的情况,使用 Maven 3.x.x。传递的参数将被忽略。 Maven 抱怨包含表达式。
  • 如果你不为你的构建过程提供版本变量会发生什么?空版本或字符串${version}。我认为这种方法还可以,但更好的是 John Velonis 的答案。它更容错。
  • 投反对票,因为 ${version} 或除 John Velonis 答案中列出的 3 之外的任何名称都会导致记者注意到 mvn 的警告。
猜你喜欢
  • 2017-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-31
  • 1970-01-01
  • 1970-01-01
  • 2012-12-02
相关资源
最近更新 更多