契约测试 No stubs or contracts were found for [XXX]问题解决

article/2025/9/24 14:29:42

1、问题

最近在学习契约测试,用到的是spring-cloud-contract,网上有很多教程,便试着照葫芦画瓢的方式,来实现一遍。由提供者建立契约、生成存根,然后把存根交给消费方测试时,抛出了一个异常No stubs or contracts were found for [XXX],详细异常如下:

Caused by: org.eclipse.aether.resolution.ArtifactResolutionException: Could not find artifact com.contract:ContractTest:jar:stubs:0.0.1-SNAPSHOTat shaded.org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolve(DefaultArtifactResolver.java:423) ~[spring-cloud-contract-shade-2.2.2.RELEASE.jar:2.2.2.RELEASE]at shaded.org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolveArtifacts(DefaultArtifactResolver.java:225) ~[spring-cloud-contract-shade-2.2.2.RELEASE.jar:2.2.2.RELEASE]at shaded.org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolveArtifact(DefaultArtifactResolver.java:202) ~[spring-cloud-contract-shade-2.2.2.RELEASE.jar:2.2.2.RELEASE]at shaded.org.eclipse.aether.internal.impl.DefaultRepositorySystem.resolveArtifact(DefaultRepositorySystem.java:257) ~[spring-cloud-contract-shade-2.2.2.RELEASE.jar:2.2.2.RELEASE]at org.springframework.cloud.contract.stubrunner.AetherStubDownloader.unpackedJar(AetherStubDownloader.java:185) ~[spring-cloud-contract-stub-runner-2.2.2.RELEASE.jar:2.2.2.RELEASE]... 78 common frames omitted
Caused by: org.eclipse.aether.transfer.ArtifactNotFoundException: Could not find artifact com.contract:ContractTest:jar:stubs:0.0.1-SNAPSHOTat shaded.org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolve(DefaultArtifactResolver.java:413) ~[spring-cloud-contract-shade-2.2.2.RELEASE.jar:2.2.2.RELEASE]... 82 common frames omitted//省略...Caused by: java.lang.IllegalArgumentException: No stubs or contracts were found for [com.contract:ContractTest:0.0.1-SNAPSHOT:stubs] and the switch to fail on no stubs was set.at org.springframework.cloud.contract.stubrunner.CompositeStubDownloader.downloadAndUnpackStubJar(CompositeStubDownloaderBuilder.java:77) ~[spring-cloud-contract-stub-runner-2.2.2.RELEASE.jar:2.2.2.RELEASE]at org.springframework.cloud.contract.stubrunner.StubRunnerFactory.createStubsFromServiceConfiguration(StubRunnerFactory.java:75) ~[spring-cloud-contract-stub-runner-2.2.2.RELEASE.jar:2.2.2.RELEASE]at org.springframework.cloud.contract.stubrunner.BatchStubRunnerFactory.buildBatchStubRunner(BatchStubRunnerFactory.java:69) ~[spring-cloud-contract-stub-runner-2.2.2.RELEASE.jar:2.2.2.RELEASE]at org.springframework.cloud.contract.stubrunner.spring.StubRunnerConfiguration.batchStubRunner(StubRunnerConfiguration.java:87) ~[spring-cloud-contract-stub-runner-2.2.2.RELEASE.jar:2.2.2.RELEASE]at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_151]at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_151]at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_151]at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_151]at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]... 67 common frames omitted

根据异常可知道大致的意思是找不到存根。spring-cloud-contract我用的是2.2.2-RELEASE版本,消费方使用的存根是指向本地的maven仓库的,代码如下:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment=SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureMockMvc
@AutoConfigureStubRunner(ids = {"com.contract:ContractTest:0.0.1-SNAPSHOT:stubs:8080"},
stubsMode = StubRunnerProperties.StubsMode.LOCAL)
public class TestConsumer {
}

然后我找了一下本地的仓库,发现是有ContractTest:0.0.1-SNAPSHOT-stubs.jar这个存根的,但为啥找不到呢?百思不得其姐…于是网上找答案,也很少相关的答案。于是只能“吃自己”了…

2、源码跟踪

网上找不到答案,那只能搜索一下源码了,因为我觉得问题应该是出在查找本地仓库那块了。因为StubsMode有三种情况,现在我用的是LOCAL。

	public enum StubsMode {CLASSPATH,//类路径LOCAL,//本地REMOTE,//远程}

于是我查找了StubsMode的引用,一路跟踪,最终找到了读取本地库的位置,就是这个localRepositoryDirectory方法

	public static RepositorySystemSession newSession(RepositorySystem system,boolean workOffline) {DefaultRepositorySystemSession session = MavenRepositorySystemUtils.newSession();session.setOffline(workOffline);if (!workOffline) {session.setUpdatePolicy(RepositoryPolicy.UPDATE_POLICY_ALWAYS);}session.setChecksumPolicy(RepositoryPolicy.CHECKSUM_POLICY_WARN);String localRepositoryDirectory = localRepositoryDirectory(workOffline);//加载本地仓库的目录if (log.isDebugEnabled()) {log.debug("Local Repository Directory set to [" + localRepositoryDirectory+ "]. Work offline: [" + workOffline + "]");}LocalRepository localRepo = new LocalRepository(localRepositoryDirectory);session.setLocalRepositoryManager(system.newLocalRepositoryManager(session, localRepo));return session;}

深入这个方法,最后来到了"罪魁祸首"的地方—userSettings方法,这个方法里面有个读取系统变量的过程,就是fromSystemPropOrEnv(MAVEN_USER_SETTINGS_LOCATION),MAVEN_USER_SETTINGS_LOCATION常量值是org.apache.maven.user-settings,由上下文可以得知这个是配置maven仓库的setting.xml的路径,如果不设置这个路径,就会默认找user.home路径下的那个setting.xml。这我才想起,我的maven仓库并不是在user.home下的,而是另外建了个仓库地址!

	private static File userSettings() {//MAVEN_USER_SETTINGS_LOCATION=org.apache.maven.user-settingsString user = fromSystemPropOrEnv(MAVEN_USER_SETTINGS_LOCATION);if (user == null) {return new File(new File(System.getProperty("user.home")).getAbsoluteFile(),File.separator + ".m2" + File.separator + "settings.xml");}return new File(user);}

3、解决问题

得知了原因,问题就好解决了,只要把系统参数org.apache.maven.user-settings设置为正确的地址不就可以了?我用的是eclipse,在启动设置那里添加环境变量,来设置setting.xml的位置。
在这里插入图片描述
重启消费方,发现问题得解!!!

4、结论

从这个案例来看,我们不由得感叹阅读源码的重要性!源码不仅可以让你学习到很多思想,而且可以帮助你解决问题。网上可能有问题的解决方案,但是有时候你只知道怎么解决问题,但不知道为啥这样解决。源码可以让你从根本上去认知这套框架、系统,对于问题的解答,你也可以从最根源出着手!


http://chatgpt.dhexx.cn/article/AbIb7HGO.shtml

相关文章

mockito_Mockito – JAXB的RETURNS_DEEP_STUBS

mockito 很抱歉没有写一段时间,但是我正忙于为DZone编写JBoss Drools Refcard,而且我正在写一本有关Mockito的书,因此我没有太多时间来写博客了…… 无论如何,最近在我当前的项目中,我对使用Mockito和JAXB结构进行单元…

gnu/stubs-32.h

64位系统下编译32位程序 g -m32 出现/usr/include/gnu/stubs.h:7:27: 致命错误:gnu/stubs-32.h:没有那个文件或目录, 解决:root用户下安装32位的glibc库文件 安装32位glibc库文件命令: yum install glibc-devel.i…

Mockito – JAXB的RETURNS_DEEP_STUBS

很抱歉没有写一段时间,但是我正忙于为DZone编写JBoss Drools Refcard,而且我正在写一本有关Mockito的书,因此我没有太多时间来写博客了…… 无论如何,最近在我当前的项目中,我对使用Mockito和JAXB结构进行单元测试有一个有趣的情况。 我们已经从为我们提供的模式生成的嵌…

Ubuntu linux解决stubs-32.h缺失

在ubuntu linux编译qnx平台时提示: fatal error: gnu/stubs-32.h: No such file or directory 查了一圈后 输入 sudo apt-get install libc6-dev-i386 此后stubs-32.h会出现在 /usr/include/x86_64-linux-gnu/gnu/ 将gnu文件夹移动到对应的qnx平台环境目录下即可…

第一章 使用SOAPUI测试和开发Web Services Stubs

Stub(桩件)的作用是:如果一个接口有很多方法,如果要实现这个接口,就要实现所有的方法。但是一个类从业务来说,可能只需要其中一两个方法。如果直接去实现这个接口,除了实现所需的方法,还要实现其他所有的无…

单元测试探析:什么是Stubs、Mocks、Spies、Dummies?带你了解4个核心工具

在单元测试中,对象之间的依赖往往交织到一起,需要拆成各个单元才能逐个击破,这也是单元测试的目的。如何将这些交织到一起的对象拆开,需要一些工具,这些工具业内人们称其为“测试替身”。 本文作者介绍了单元测试中的…

分布式CAP 定理

历史 这个定理起源于柏克莱加州大学University of California, Berkeley的计算机科学家埃里克布鲁尔在2000年的分布式计算原则研讨会(Symposium on Principles of Distributed Computing(PODC))上提出的一个猜想。 在2002年&…

简单解释CAP定理

简单解释下分布式系统中的CAP定理: CAP定理: P-分区容错性, C-一致性, A-可用性 (易 ---> 难) CAP如何选择 > 在不同的业务领域中对CAP的选择有所不同; (典型的情况以及选取的规则) CAP的重要性 > CAP是分布式系统设计中最基础也最为关键的理论! (分布式系统不可能同…

CAP定理以及BASE定理详解

CAP 是分布式系统设计理论,BASE 是 CAP 理论中 AP 方案的延伸。 CAP定理 C:Consistency(一致性)、A: Availability(可用性)、P: Partition Tolerance(分区容错性) 一致性&#xf…

架构设计之「 CAP 定理 」

在计算机领域,如果是初入行就算了,如果是多年的老码农还不懂 CAP 定理,那就真的说不过去了。CAP可是每一名技术架构师都必须掌握的基础原则啊。 现在只要是稍微大一点的互联网项目都是采用 分布式 结构了,一个系统可能有多个节点组…

图解 CAP 定理(转载)

文章目录 CAP 定理不一致的产生解决方案保 CP 失 A保 AP 失 C CAP 定理 Consistency 一致性:访问分布式系统中任意节点,总能返回一致的结果 Every read receives the most recent write or an errorAvailability 可用性:分布式系统总能向客户…

分布式系统的CAP定理

目前只要是大型互联网项目都是采用分布式结构,一个系统可能有多个节点组成,每个节点都可能需要维护一份数据。那么如何维护各个节点之间的状态,如何保障各个节点之间数据的同步问题就是大家急需关注的事情了。CAP定理是分布式系统中最基础的原…

CAP 定理的含义

看到一篇很好的关于 CAP 定理的博文,顺便转发一下,by:阮一峰 分布式系统(distributed system)正变得越来越重要,大型网站几乎都是分布式的。 分布式系统的最大难点,就是各个节点的状态如何同步。…

CAP定理和BASE理论

2000 年的时候,Eric Brewer 教授提出了 CAP 猜想,2年后,被 Seth Gilbert 和 Nancy Lynch 从理论上证明了猜想的可能性,从此,CAP 理论正式在学术上成为了分布式计算领域的公认定理。并深深的影响了分布式计算的发展。 …

分布式-CAP定理

在分布式学习中,我们经常遇到一个概念便是CAP,它是分布式很重要的理论基础。很多分布式算法也是在不断的在解决相关问题,今天就让我们重新学习或者回顾一下这个知识点吧,加深印象打牢基础。 一、简介 CAP定理(CAP theo…

佳文分享:CAP定理

1976年6月4号,周5,在远离音乐会大厅的一个楼上的房间内,在位于Manchester的Lesser Free Trade Hall ,Sex Pistols 乐队(注:Sex Pistols的经理人Malcolm McLaren 2010.4.8去世)开始了他们的第一次…

谈谈对CAP定理的理解

谈谈对CAP定理的理解 CAP定理的常规解释是任何分布式系统只能在一致性(Consitency),可用性(Availability)和分区容忍性(Partition Tolerance)中三选二。这个解释很让人费解,笔者在看了一些文章后谈谈我对它的理解,还请斧正。 从问题出发 假设…

分布式系统的 CAP 定理

CAP定理指出,在一个分布式系统中,对于一致性、可用性、分区容错这三个特性,不可能同时满足,而是必须有所舍弃。我们设计分布式系统时,必须在三者之间(尤其是一致性和可用性之间)有所取舍和平衡。…

简述CAP定理

CAP定理示意图: 一.CAP理论概述: CAP定理告诉我们,一个分布式系统不可能同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance)这三个基本需求&…

CAP定理的含义

目录 定理解读 如何抉择 1998年,加州大学的计算机科学家 Eric Brewer 提出了分布式系统的三个指标: C:Consistency,一致性。在分布式系统中的所有数据备份,在同一时刻具有同样的值,所有节点在同一时刻读…