从 pom 中的项目版本中删除 -SNAPSHOT

Posted

技术标签:

【中文标题】从 pom 中的项目版本中删除 -SNAPSHOT【英文标题】:Remove -SNAPSHOT from project version in pom 【发布时间】: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版本。 【参考方案1】:

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

mvn versions:set -DremoveSnapshot

【讨论】:

感谢这个,这是最简单的解决方案! @jeanMarcAssin 这不应该是公认的答案吗? 适用于插件版本 2.5。不适用于插件版本 2.2。中间不知道。 2.5 版是撰写本文时的最新版本。 不错!非常感谢。如果你使用版本控制,就不要使用那个愚蠢的穷人的备份机制:mvn versions:set -DremoveSnapshot -DgenerateBackupPoms=false @JuanRamos mojohaus.org/versions-maven-plugin/set-mojo.html#removeSnapshot【参考方案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 插件的配置中。

【讨论】:

以上是关于从 pom 中的项目版本中删除 -SNAPSHOT的主要内容,如果未能解决你的问题,请参考以下文章

为啥我必须从我的 pom 中删除一个依赖项,然后再将其添加回来并安装以获取最新版本的 maven 包?

idea配置maven项目

Idea解决Maven项目中依赖包下载好之后代码标红问题

清理 Maven 依赖管理

在 Eclipse 中运行时从 pom 获取 maven 项目版本和工件 ID

如何处理多模块项目中的 Maven 版本?