从 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-plugin
、parse-version
目标将解析 POM 的当前版本并将其设置在一组属性中,默认情况下,parsedVersion
作为前缀,majorVersion
、minorVersion
、incrementalVersion
作为后缀(查看文档,您还将拥有classifier
和buildNumber
)。因此,在它执行之后,我们可以在 POM 中使用 $parsedVersion.majorVersion
等属性。
versions-maven-plugin
、set
目标随后将使用这些属性来构建您真正想要的新版本(在本例中删除 SNAPSHOT,因为我们排除了 $parsedVersion.classifier
属性)。
最后,versions-maven-plugin
、commit
目标将使这些更改生效。
【讨论】:
【参考方案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。或者,您可以将<generateBackupPoms>false</generateBackupPoms>
添加到versions
插件的配置中。
【讨论】:
以上是关于从 pom 中的项目版本中删除 -SNAPSHOT的主要内容,如果未能解决你的问题,请参考以下文章
为啥我必须从我的 pom 中删除一个依赖项,然后再将其添加回来并安装以获取最新版本的 maven 包?