从pom文件中移除项目版本号的-SNAPSHOT后缀

36

我有一个POM文件,其中包含以下的GAV信息

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

我希望能够在批处理模式下使用Maven删除此代码中的“-SNAPSHOT”,这样我就可以在Jenkins上进行操作,而不必手动指定任何内容。

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

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


2
mvn versions:set -DnewVersion=1.0.21 应该可以解决问题,不是吗? - Behe
是的,但不完全是。你是如何在没有使用 less、cat 或 grep pom 的情况下得到字符串“1.0.21”的? - Jepper
1
需要全部使用Maven吗?你可以通过help插件获取版本号 - mvn help:evaluate -Dexpression=project.version,但是之后你需要一些sed或其他帮助来去掉'SNAPSHOT'后缀。当然你也可以直接grep版本号。 - Hardy
回到这个话题,我想说,理解Maven发布流程是正确的方式;试图混淆快照和发布版本是错误的。使用Maven发布插件教会了我很多东西。 - Jepper
@Jepper 我添加了一个新答案,你可能想把它设为被接受的答案(使用 mvn versions:set -DremoveSnapshot 的那个,而不是我的旧答案)。 - Rinke
显示剩余2条评论
4个回答

75

自从版本2.10的Versions Maven插件,您可以简单地执行:

mvn versions:set -DremoveSnapshot

1
谢谢您提供的解决方案,这是最简单的解决方法! - Pierre
1
适用于插件版本2.5。不适用于插件版本2.2。不确定中间版本。在撰写本文时,版本2.5是最新版本。 - Radu
3
好的!非常感谢。如果您使用版本控制,请放弃那种愚蠢的贫民备份机制:mvn versions:set -DremoveSnapshot -DgenerateBackupPoms=false - Garret Wilson
1
@JuanRamos https://www.mojohaus.org/versions-maven-plugin/set-mojo.html#removeSnapshot - Rinke
@Radu自2.10版本开始工作,请参见https://www.mojohaus.org/versions-maven-plugin/set-mojo.html#removeSnapshot - elonderin
显示剩余3条评论

13
如果您真的不想使用Maven Release插件(无论出于什么原因),以下是我成功地从标准方式中删除maven POM中的SNAPSHOT后缀(作为分类器处理)的方法(即,没有脚本,没有自定义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-plugin 插件的 parse-version 目标将解析当前 POM 的版本,并将其设置为一组属性,这些属性默认具有 parsedVersion 作为前缀,majorVersionminorVersionincrementalVersion 作为后缀(请参阅文档,还将包括 classifierbuildNumber)。因此,在执行后,我们可以在 POM 中使用诸如 ${parsedVersion.majorVersion} 等属性。
  • versions-maven-plugin 插件的 set 目标将使用这些属性来构建您实际想要的新版本(在本例中删除 SNAPSHOT,因为我们排除了 ${parsedVersion.classifier} 属性)。
  • 最后,versions-maven-plugin 插件的 commit 目标将使这些更改生效。

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。或者,您可以将<generateBackupPoms>false</generateBackupPoms>添加到versions插件的配置中。

4
与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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接