我应该如何检索最新版本的 Maven 项目以进行合同测试?

Posted

技术标签:

【中文标题】我应该如何检索最新版本的 Maven 项目以进行合同测试?【英文标题】:How should I retrieve the latest version of a Maven project for contract testing? 【发布时间】:2017-05-11 02:52:28 【问题描述】:

我们使用 Maven 和 Nexus 在我们的基础架构中分发组件(Maven 项目)。为了便于讨论,假设我们有两个团队:Team Foo 和 Team Bar;并且来自 Bar 的组件依赖于来自 Foo 的组件。

Team Bar 想要编写合约测试来检查组件 foo 的行为是否符合预期。这些测试将在每晚针对项目foo 的最新稳定开发版本(CI 之后的 git master)运行。 Team Bar 能否编写一个依赖于最新版本 foo 的 Maven 项目 bar/pom.xml?我们该怎么做呢?

我们正在尝试通过版本命名来解决这个问题。我们总是将开发中的版本命名为master-SNAPSHOT(或其他名称),而不是版本标签为0.1-SNAPSHOT -> 0.1 -> 0.2-SNAPSHOT -> 0.2,它总是回到master-SNAPSHOT,如master-SNAPSHOT -> 0.1 -> master-SNAPSHOT -> 0.2。然后合约测试项目bar 可以将其对foo 的依赖声明为com.acme:foo:master-SNAPSHOT

但这似乎太笨拙了(破坏了常见的 Maven 实践和东西)......这种事情有更标准的实践吗?我们应该使用Maven Versions Plugin 吗?我们是否应该将最新版本的字符串从外部注入到 Maven 项目中?或者完全抛弃 Maven?

【问题讨论】:

为什么<version>-SNAPSHOT不适合? 非常合适。但它类似于master-SNAPSHOT。不是吗? 我的意思不是字面上的<version>,我的意思是0.1-SNAPSHOT0.2-SNAPSHOT等等。 根据 Maven 参考书 (books.sonatype.com/mvnref-book/reference/…) 关于项目版本的第 3.3.1 节,master 不是推荐的版本标识符。在本地使用它可能没问题,但是当您通过 Nexus 或 Maven Central 分发您的工件时,它可能证明不兼容。坚持数字和点,你会没事的。 【参考方案1】:

契约测试模块通常与实现契约的模块有着非常密切的关系。

因此,我建议在父项目中同时发展这两个模块。

制作多模块 maven 项目的 foobar 模块。然后让bar 依赖于foo,就像你自己建议的那样。分配相同的版本$parent.version。这意味着您在两个版本之间使用$parent.version-SNAPSHOT

像使用单个模块一样继续发展和发布您的项目,最好在发布时使用maven-release-plugin。作为release:prepare 目标的一部分,它将同时提升所有模块的版本。

【讨论】:

以上是关于我应该如何检索最新版本的 Maven 项目以进行合同测试?的主要内容,如果未能解决你的问题,请参考以下文章

我如何告诉Maven来使用依赖的最新版本

如何在Maven仓库上查看开源项目的文档

如何从 API 捕获项目的最新 GitHub 版本?

Maven 中父项目的最新版本

Maven非标准版本控制意外的最新版本结果

从代码中的 maven pom.xml 检索版本