【问题标题】:Spring Cloud contract jar versioningSpring Cloud 合约 jar 版本控制
【发布时间】:2026-02-06 02:10:01
【问题描述】:

我已经成功在我的项目中的两个微服务之间建立了 Spring Cloud 合约。直到昨天一切都很好。

在消费者方面,我引用了最新版本的存根,如下所示:

@AutoConfigureStubRunner(ids = {"com.example:http-server-dsl:+:stubs:8080"})

但这在某些情况下会导致问题,即生产者方恢复其最新版本并切换回以前的版本。

或者

不知何故,包含当前存根的 jar 的版本低于 maven repo 中的最新版本。

Spring 云合约中是否有办法执行以下任一操作?

1) 配置消费者端获取当前项目版本(指 pom.xml 中的项目版本)而不是 maven repo 中的最新版本?

或者

2) 将生产者端配置为具有静态版本的存根 jar,但保留其他项目 jar 的动态版本。这将允许消费者方引用相同的静态版本的存根 jar

我阅读了文档https://cloud.spring.io/spring-cloud-static/spring-cloud-contract/2.1.1.RELEASE/single/spring-cloud-contract.html#_jar_versioning,但没有帮助

【问题讨论】:

    标签: spring-cloud-contract


    【解决方案1】:

    您可以使用提供的版本。我们给+ 总是下载最新的。您可以设置一个具体的值,例如2.1.1.RELEASE。您还可以设置范围。总而言之,我们在下面使用了 Ivy,所以你可以查看 Ivy 的规则http://ant.apache.org/ivy/history/latest-milestone/settings/version-matchers.html

    1) 配置消费者端选择当前项目版本而不是最新版本?

    current 是什么意思?是最新的吗?最新发布?如果是最新版本,请选择 +,但指向仅包含发布版本且不包含快照的存储库。

    我阅读了https://cloud.spring.io/spring-cloud-static/spring-cloud-contract/2.1.1.RELEASE/single/spring-cloud-contract.html#_jar_versioning 的文档,但没有帮助

    本节缺少什么?你问过静态存根,我们也在那里描述它@AutoConfigureStubRunner(ids = {"com.example:http-server-dsl:2.1.1:stubs:8080"})

    【讨论】:

    • 感谢您的回复。目前,我指的是 pom.xml 中的项目版本。我已经提供了我的答案:)
    • 我是否正确理解您正在为自己的项目使用自己的存根?我完全不明白用例是什么,但我相信你知道你在做什么:)
    • 我们有两个微服务,它们的版本总是相同的
    • 这听起来像是一种反模式,但就像我说的那样,你肯定知道你在做什么
    【解决方案2】:

    以下工作(用于 maven 项目)。

    Step1:我们可以在 application.properties 文件中提供它,而不是在 @AutoConfigureStubRunner 中指定 id(注意 @project.version@,这是指 maven 项目版本)

    stubrunner.ids=com.example:http-server-dsl:@project.version@:stubs:8080
    

    Step2:为了能够在属性文件中使用@project.version@,在pom.xml的构建部分添加以下内容:

     <resources>
                <resource>
                    <directory>src/main/resources</directory>
                    <filtering>true</filtering>
                </resource>
            </resources>
    

    在插件部分:

       <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-resources-plugin</artifactId>
            <version>${mvn-resources-plugin.version}</version>
            <configuration>
                <delimiters>
                    <delimiter>@</delimiter>
                </delimiters>
                <useDefaultDelimiters>false</useDefaultDelimiters>
            </configuration>
        </plugin>
    

    【讨论】: