如果某个工件已经存在,如何使 Maven 构建失败

Posted

技术标签:

【中文标题】如果某个工件已经存在,如何使 Maven 构建失败【英文标题】:How to fail a Maven build if a certain artifact already exists 【发布时间】:2017-08-18 21:24:55 【问题描述】:

如果存储库中存在某个工件确实,我如何使构建失败? Maven Wagon 插件有一个“存在”的目标,但并非相反。

我的问题的原因如下。

我的 Maven 项目通过一个自动构建管道,该管道在发布阶段结束。在使用mvn versions:set -DremoveSnapshot 设置发布版本之后,此阶段通过mvn deploy -P release 执行自动发布。该阶段是手动触发的(因为并非每次推送都会导致发布)。

如果要上传的工件已经在存储库中,mvn deploy 将失败。但是这种失败会很晚才出现,在管道的最后阶段,而可以更早地检查存储库中的存在。

为了获得快速失败的行为,我想检查将要发布的工件是否没有已经上传到 Nexus。我想在管道的第一阶段执行此操作,它只执行mvn package -P releasable。 “可发布”配置文件最好让 Maven 在默认生命周期的“验证”阶段自动执行此检查。

【问题讨论】:

这最终意味着您在 poms 中的版本未正确更新为未正确维护导致在 Nexus 部署期间失败意味着您尝试部署的版本已经存在?跨度> @khmarbaise 是的 好的那么现在的问题是:为什么您没有正确维护基于场景隐含的版本? @khmarbaise 我们正在与许多团队一起开发许多组件(Maven 项目)。大约 100 名程序员中的一个可能会犯一个错误:我们都是人类。这个问题是关于快速失败的行为。 这不是重点。我们在这里谈论的是一个项目,它应该由您的 CI 流程正确处理,而不是手动处理..例如通过 Jenkins...您所谈论的阶段应该处理正确发布版本的设置,当然还有下一个开发版本也是如此......并且不需要手动完成任何事情......作为一个快速失败的选项,我可以考虑一个自我实现的maven-enforcer-rule......它在构建开始时检查是否发布版本(仅在发布版本的情况下)如果它已经存在并破坏构建.. 【参考方案1】:

如果要上传的工件已经在仓库中,mvn deploy 将失败

注意:仅当您上传为“RELEASE”而非“SNAPSHOT”时。

你的构建可以check first if that release version exists:

mvn dependency:get -Dartifact=g:a:v -o -DrepoUrl=file://path/to/your/repo

如果该 gav (group-artifact-version) 确实存在,那么您无需继续进行其余的构建。

要将其保存在 pom.xml 中,您可以使用:

activation profile,由属性激活。 所述属性将通过第一个构建步骤(甚至在生命周期之前)调用mvn dependency:getusing the maven-dependency-plugin task 来设置。

dependency:get 只是将工件放在本地存储库中(如果存在)。 我不确定从那时起如何使构建失败,因为检查本地仓库还不够好。

您可以检查本地maven repo中是否存在依赖项。

【讨论】:

对了,我忘了说发布阶段去掉了“-SNAPSHOT”部分。感谢你的回答。你说:“......那么你就不用继续构建剩下的部分了。”怎么可能做到? @Rinke “那么你就不要继续构建其余的部分了。那怎么能做到呢?”通过包装器(您编写的脚本),它首先进行检查,然后仅在检查通过时调用通常的 maven 构建。 啊,你的意思是类似于 shell 脚本。难道不能在Maven本身中解决吗?我想要一个配置文件在默认生命周期的“验证”阶段处理它。 (我更新了我的问题以说明这一点。) @Rinke 您确实可以在验证阶段进行依赖:get 调用。请参阅我编辑的答案。 dependency:get 只是将工件放在本地存储库中(如果存在)。我不确定从那时起如何使构建失败,因为检查本地仓库还不够好。这是因为如果由于某种原因发布工件将在本地存储库中,但 不在 Nexus 中(例如,作为先前构建的发布阶段失败的结果),那么构建应该成功,不会失败。

以上是关于如果某个工件已经存在,如何使 Maven 构建失败的主要内容,如果未能解决你的问题,请参考以下文章

如何在SBT中发布之前检查工件是否存在

bug记录----Maven项目发布失败

当质量门失败时,如何使 Maven 构建失败?

Maven 中缺少工件错误

如果 .cshtml 文件中存在 razor/C# 错误,如何在 VS 2013 中使构建失败? [复制]

是否将“仅在构建成功时存档工件”设置为 true 意味着,如果构建失败,任何工件都不会在 Jenkins 中创建?