【问题标题】:Maven system property priorityMaven系统属性优先级
【发布时间】:2010-09-15 05:15:17
【问题描述】:

我有以下 pom.xml

<project>
  <properties>
    <buildNumber>dev</buildNumber>
  </properties>
  <build>
    <finalName>${project.artifactId}-${project.version}-${buildNumber}</finalName>
  </build>
</project>

这在开发机器上运行良好。如果我运行mvn package 我有project-1.1-dev.war 工件。如果我运行mvn package -DbuildNumber=121,我就会得到package-1.1-121.war

但是,尽管 buildNumber 属性已传递给 maven,但 CI 服务器 (TeamCity) 始终得到 project-1.1-dev.war(如果我从 pom.xml 中删除默认属性定义,maven 会使用正确的文件名构建工件)。

似乎系统属性解析优先级在某种程度上取决于平台(maven 版本在开发人员机器和 TC - 2.2.1 上都相同)?

【问题讨论】:

    标签: java maven-2 teamcity system-properties


    【解决方案1】:

    这有点奇怪......也许你不能强制命令行中给出的参数具有比&lt;properties&gt;标签中定义的最高优先级。

    一个想法是使用定义属性buildNumber的配置文件:

    <profiles>
        <profile>
            <id>dev-property</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <buildNumber>dev</buildNumber>
            </properties>
        </profile>
    </profiles>
    

    所以默认情况下,buildNumber 将等于 dev 值。现在,在您的 TeamCity 命令行中,使用命令 mvn ... -P !dev-property 禁用此配置文件(配置文件 ID 前的 ! 表示必须禁用该配置文件)。

    【讨论】:

      【解决方案2】:

      您的问题的答案在于 SO 上的另一个问题:Maven property overloading

      简而言之,你需要在maven命令行(在“3 build step: maven”页面上)传递-DbuildNumber=121,因为在“6 properties and variables”页面上设置系统属性“buildNumber”不会覆盖Maven 属性。

      【讨论】:

        【解决方案3】:

        您熟悉SNAPSHOT 版本的概念吗?听起来像您正在尝试做的事情,并且 Maven 开箱即用地支持。看起来您想构建 major-minor-incrementalmajor-minor-dev,如果您可以使用 major-minor -incremental-SNAPSHOT 相反,它应该做你想做的事。

        【讨论】:

        • 不完全是。我需要一种方法来区分任何两个构建工件(在生产中部署时)。使用 SNAPSHOT 我不能这样做。所有构建工件都将具有名称 project-1.1-SNAPSHOT.war
        • 如果您有两个单独的版本要部署到生产环境,它们应该有不同的版本号,创建发布的行为应该消耗一个版本。 SNAPSHOT 构建(或开发构建)永远不应该被部署。你是说你的构建会因构建在哪台机器上而有所不同?
        • 我们有增量开发周期,每次更改源代码后更改 POM 描述符中的版本对我们来说都是多余的。所以我们使用以下方案:开发人员定义工件的版本(基于更改语义:向后兼容性等),CI 服务器使用递增计数器来标记工件。 “开发”工件未部署到生产环境。
        • 当您说矫枉过正时,您的意思是您不希望 TeamCity 在进行增量构建时提交版本控制吗?它如何管理其buildNumber?我认为您可以让 TeamCity 使用增量构建,并且您的开发人员继续像当前那样设置主要/次要修订。在您所描述的循环中,我看不到任何破坏 SNAPSHOT 提供的分隔的东西
        猜你喜欢
        • 1970-01-01
        • 2020-07-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-05
        • 1970-01-01
        相关资源
        最近更新 更多