通过属性文件指定 pom 属性?

Posted

技术标签:

【中文标题】通过属性文件指定 pom 属性?【英文标题】:Specify pom properties via a properties file? 【发布时间】:2015-03-15 05:47:19 【问题描述】:

由于我的构建系统的设计方式(RTC 构建引擎),我想通过属性文件为 maven 提供属性值,而不是为每个属性指定 -Dkey=value。

我在 S.O. 上发现了几个问题。 (How to set build properties from a file in Maven POM? 和 How to read an external properties file in Maven)与这个问题完全相关,但它们相对较旧,并且都需要自定义插件才能工作(处于 alpha 状态)。

我意识到像这样向 Maven 传递参数可能不是最好的解决方案,但另一个选项是通过 -D 设置在命令行上指定所有内容,这也不理想。

此外,鉴于此属性文件仅由构建引擎真正使用(而不是由单个开发人员使用),我并不真正相信它属于 pom.xml 文件。但我找不到任何其他允许我指定要使用的插件的机制 - settings.xml 不允许指定插件。

在这种情况下,我唯一的选择是使用插件并在项目 pom 中指定它吗?

【问题讨论】:

您能举例说明您想提供什么样的房产吗? @khmarbaise :例如:-Dcore-version=1234 -Dlib-version=1234 -Dbuild-version=9999、-Dbuild-date=20150101 等 为什么喜欢定义 lib-version?没有道理吗?因为它们是在 pom.xml 中定义的。我能理解的是使用诸如 build-version...Build-Date 之类的东西(这可以通过不同的方式处理)。 @khmarbaise 我不喜欢定义这些值参数样式,但不幸的是,我别无选择。我正在将现有的生产构建系统从一个源代码控制/构建系统迁移到另一个,并且他们当前的构建使用脚本和手动定义的变量。这是一个迭代过程,长期目标是完全删除这些变量,但作为第一步,必须以这种方式完成。 【参考方案1】:

在这种情况下最好至少升级到支持在命令行上定义此类属性的 Maven 3.2.1,如下所示:

mvn -Drevision=1234 -Dchangelist=WhatEver -Dsha1=XXXX clean package

但你只能使用上面的名字。

Excerpt from release notes:

防止 Maven 发出有关版本的警告的简单更改 带有属性表达式。版本中允许的属性表达式 包括 $revision、$changelist 和 $sha1。这些属性可以 在外部设置,但最终会在 Maven 中创建一个机制 这些属性可以以标准方式注入。例如 您可能想收集当前的 Git 修订版并注入该值 进入 $sha1。这绝不是一个完整的连续解决方案 交付,但这是朝着正确方向迈出的一步。

【讨论】:

【参考方案2】:

你可以在 pom 中放置...

<properties>
    <core-version>1234</core-version>
    <lib-version>1234</lib-version>
    <build-version>9999</lib-version>
    <build-date>20150101</build-date>
</properties>

包含您需要的所有属性。

或者你可以使用...

<build>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>properties-maven-plugin</artifactId>
        <version>1.0-alpha-2</version>
        <executions>
          <execution>
            <phase>initialize</phase>
            <goals>
              <goal>read-project-properties</goal>
            </goals>
            <configuration>
              <files>
                <file>dev.properties</file>
              </files>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

文件dev.properties 将包含属性

core-version=1234
lib-version=1234
build-version=9999
build-date=20150101
...

或者...您可以使用 settings.xml 文件注入属性,如 here 所示

您可能还会发现 Maven 内部版本号插件很有用...here

【讨论】:

我已经找到了那个插件,但担心它自 2009 年以来就没有被触及过。所以我想看看是否有一种“更好”的方法来做到这一点。令我惊讶的是,在 5 年中,没有人想出比使用仍处于“alpha”状态的插件不同的、更被接受的方式。 如何为插件提供补丁并改进它?它是开源的...? 我基本上得到了这个解决方案。不是我喜欢的,但暂时可以使用。谢谢。 确认。刚刚发现我无法使用通过插件设置的属性指定版本号,因为如果有未定义的版本#s,maven 不会认为 pom 是有效的。因此,它甚至没有启动它的生命周期。我什至尝试将插件置于验证阶段,但似乎不起作用。

以上是关于通过属性文件指定 pom 属性?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 Maven 属性将属性设置为 gwt.xml 文件?

通过MSI属性指定MSI转换

Maven 发布插件:指定新的开发版本不影响 pom 的自定义属性

PyQt5 资源加载总结

通过使用 LINQ 指定祖先节点从节点获取所有属性值

如何在 maven pom 属性值中转义“&”[重复]