【问题标题】:Remove -SNAPSHOT from project version in pom从 pom 中的项目版本中删除 -SNAPSHOT
【发布时间】:2014-06-23 10:41:55
【问题描述】:

我有一个带有以下 GAV 的 pom

<groupId>com.company.services</groupId>
<artifactId>test-branch-2</artifactId>
<version>1.0.21-SNAPSHOT</version>

我想在批处理模式下使用 maven 从中删除 -SNAPSHOT,所以我可以使用 Jenkins 来完成,而不必手动指定任何内容。

我查看了 version:set 的文档,但所有选项都为我提供了交互式提示,并要求我输入版本名称。

我更喜欢版本插件,而不是发布插件。

【问题讨论】:

  • mvn versions:set -DnewVersion=1.0.21 应该可以解决问题,不是吗?
  • 是的,但不是。你是如何得到字符串“1.0.21”的,而没有对 pom 进行less'ed 或 cat'ed 或 grep'ed?
  • 啊,我明白了。看看page 123 f. of DevOps for Developers,Michael Hüttermann 描述了一个 Maven 插件,它删除了 -SNAPSHOT 并相应地设置了版本插件的 newVersion 属性。
  • 我放弃了。我现在正在使用发布插件。
  • 而且必须全是 Maven?您可以通过帮助插件获取版本 - mvn help:evaluate -Dexpression=project.version,但是您需要一些 sed 的帮助或其他东西来删除“SNAPSHOT”后缀。当然你也可以直接grep版本。

标签: maven maven-3 pom.xml maven-release-plugin versions-maven-plugin


【解决方案1】:

从版本 2.10 版本的 Maven 插件开始,您可以简单地执行以下操作:

mvn versions:set -DremoveSnapshot

【讨论】:

  • 感谢这个,这是最简单的解决方案!
  • @jeanMarcAssin 这不应该是公认的答案吗?
  • 适用于插件版本 2.5。不适用于插件版本 2.2。中间不知道。 2.5 版是撰写本文时的最新版本。
  • 不错!非常感谢。如果你使用版本控制,就不要使用那个愚蠢的穷人的备份机制:mvn versions:set -DremoveSnapshot -DgenerateBackupPoms=false
【解决方案2】:

如果您真的不想使用 Maven 发布插件(无论出于何种原因),以下是我以标准方式(即,没有脚本,没有自定义 maven 插件)。

鉴于以下个人资料:

<profile>
    <id>drop-snapshot</id>
    <build>
        <plugins>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>build-helper-maven-plugin</artifactId>
                <version>1.11</version>
                <executions>
                    <execution>
                        <id>parse-version</id>
                        <phase>validate</phase>
                        <goals>
                            <goal>parse-version</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>versions-maven-plugin</artifactId>
                <version>2.2</version>
                <executions>
                    <execution>
                        <id>set-version</id>
                        <phase>validate</phase>
                        <goals>
                            <goal>set</goal>
                        </goals>
                        <configuration>
                            <newVersion>${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}</newVersion>
                        </configuration>
                    </execution>
                    <execution>
                        <id>upgrade-pom</id>
                        <phase>validate</phase>
                        <goals>
                            <goal>commit</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</profile>

简单地执行:mvn validate -Pdrop-snapshot
示例 pom 的版本从 0.0.1-SNAPSHOT 传递到 0.0.1

它是如何工作的:

  • build-helper-maven-pluginparse-version 目标将解析 POM 的当前版本并将其设置在一组属性中,默认情况下,parsedVersion 作为前缀,majorVersionminorVersionincrementalVersion作为后缀(查看文档,您还将拥有classifierbuildNumber)。因此,在它执行之后,我们可以在 POM 中使用 ${parsedVersion.majorVersion} 等属性。
  • versions-maven-pluginset 目标随后将使用这些属性来构建您真正想要的新版本(在本例中删除 SNAPSHOT,因为我们排除了 ${parsedVersion.classifier} 属性)。
  • 最后,versions-maven-plugincommit 目标将使这些更改生效。

【讨论】:

    【解决方案3】:

    类似于 A_Di-Matteo 的 build-helper 方法,但不需要额外的插件配置:

     mvn build-helper:parse-version versions:set \
         -DnewVersion=\${parsedVersion.majorVersion} \
             .\${parsedVersion.minorVersion} \
             .\${parsedVersion.incrementalVersion \
             .\${parsedVersion.buildNumber} \
          versions:commit
    

    这会将pom.xml 中的1.0.0.0 替换为1.0.0.0-SNAPSHOT

    【讨论】:

      【解决方案4】:

      将以下内容添加到您的 POM:

      <build>
          <plugins>
              <plugin>
                  <groupId>org.codehaus.mojo</groupId>
                  <artifactId>build-helper-maven-plugin</artifactId>
                  <version>1.11</version>
                  <configuration>
                      <name>newVersion</name>
                      <value>${project.version}</value>
                      <regex>-SNAPSHOT</regex>
                      <failIfNoMatch>false</failIfNoMatch>
                  </configuration>
              </plugin>
              <plugin>
                  <groupId>org.codehaus.mojo</groupId>
                  <artifactId>versions-maven-plugin</artifactId>
                  <version>2.2</version>
              </plugin>
          </plugins>
      </build>
      

      您现在可以删除项目版本中的 -SNAPSHOT 部分:

      mvn build-helper:regex-property versions:set -N
      

      -N 告诉 Maven 仅在 POM 中定义了模块的情况下处理根项目。这不是绝对必要的,但可以防止 build-helper 插件不必要地针对子模块运行。 versions 插件在任何情况下都只在根项目上运行,并自动遍历所有模块。考虑使用maven-enforcer 插件的reactorModuleConvergence 规则来确保正确处理多模块项目。

      您可以运行mvn versions:commit 来删除versions:set 生成的备份POM。或者,您可以将&lt;generateBackupPoms&gt;false&lt;/generateBackupPoms&gt; 添加到versions 插件的配置中。

      【讨论】:

        猜你喜欢
        • 2012-11-01
        • 2018-03-05
        • 1970-01-01
        • 1970-01-01
        • 2012-04-11
        • 2015-06-07
        • 2018-09-08
        • 1970-01-01
        • 2019-04-08
        相关资源
        最近更新 更多