S Stubborn

19 August 2026

Announcing Stubborn Contract 0.1.0

The first stable release of the official continuation of Spring Cloud Contract — a modern JVM stack, Spring-free messaging, and drop-in SCC compatibility.

Stubborn Contract 0.1.0 is the first stable release of the official continuation of Spring Cloud Contract. It brings consumer-driven contract testing to the JVM on a current stack, and it is published to Maven Central.

If your team already writes Spring Cloud Contract contracts, this is the release you can move to. Your existing contracts, WireMock stubs, and stub-runner setups keep working, and you get a maintained, up-to-date foundation on top.

Coordinates — pin the BOM once and every module’s version is aligned:

<dependency>
  <groupId>sh.stubborn</groupId>
  <artifactId>stubborn-contract-dependencies</artifactId>
  <version>0.1.0</version>
  <type>pom</type>
  <scope>import</scope>
</dependency>

Why this release matters

Spring Cloud Contract proved that consumer-driven contract testing belongs in the everyday JVM toolbox, and it remains a solid choice. Stubborn Contract carries that work forward under its original creator: the same ideas, the same workflow, now with the messaging layer freed from Spring so it can run anywhere on the JVM, and a build that is no longer tied to the Spring Cloud release train. It is designed so moving over is a find-and-replace, not a rewrite.

What’s in 0.1.0

End-to-end contract testing for HTTP and messaging

The core workflow is unchanged and battle-tested. The consumer writes a contract, the producer verifies it (Stubborn generates and runs the tests), and the consumer then tests against a stub generated from that same contract. If both sides are green, they are genuinely compatible, with no drifting hand-written mocks and no slow end-to-end suite.

A modern foundation

Messaging beyond Spring: Spring-free building blocks

This is the biggest new capability. The messaging abstractions (MessageVerifierSender / MessageVerifierReceiver) are Spring-free, and each broker has a plain-client building block:

TransportBuilding blockBuilt on
Kafkastubborn-contract-messaging-kafkakafka-clients
RabbitMQstubborn-contract-messaging-rabbitamqp-client
JMSstubborn-contract-messaging-jmsjakarta.jms

They carry no Spring dependency, support text and binary payloads, and are held to a transport-neutral conformance TCK that runs every block against a real broker (Testcontainers, or an embedded Artemis for JMS). Because they are Spring-free, the same messaging contract can drive verification from any JVM runtime. Spring and Quarkus are supported out of the box, and the samples also show Micronaut and Helidon consumers built directly on the building blocks.

Zero-config JSON conversion for typed listeners

A triggered messaging stub reaches a real broker as JSON. Stubborn wires the JSON converter out of the box for a typed listener, so a @KafkaListener(Order order), @RabbitListener(Order order), or @JmsListener(Order order) binds with no hand-configured MessageConverter or JsonDeserializer. This is the same zero-config experience SCC users had with its in-memory binder, and it backs off the moment you configure your own.

Framework integrations and tooling

What Stubborn Contract adds on top of Spring Cloud Contract

Everything you rely on in SCC is still here. These are the additions in 0.1.0:

Compatibility: SCC contracts, Stubborn contracts, and WireMock stubs all work

Migration is safe because 0.1.0 is deliberately backward-compatible:

You can adopt Stubborn Contract on an existing SCC codebase incrementally, without rewriting contracts or regenerating stubs.

Migrating from Spring Cloud Contract

The migration is mostly a groupId change (org.springframework.cloud becomes sh.stubborn) and a package rename (org.springframework.cloud.contract becomes sh.stubborn.contract). The fastest path is the OpenRewrite recipe that automates the mechanical steps:

./mvnw -U org.openrewrite.maven:rewrite-maven-plugin:run \
  -Drewrite.recipeArtifactCoordinates=sh.stubborn:stubborn-contract-migration:LATEST \
  -Drewrite.activeRecipes=sh.stubborn.contract.migration.MigrateFromSpringCloudContract

It rewrites your dependencies and BOM, renames the Java packages (including the jsonassert and xmlassert helpers), and converts JUnit 4 StubRunnerRule to the JUnit 5 StubRunnerExtension.

Enterprise support

Stubborn Contract is open source and free to use. For teams that want more, commercial support is available, and enterprises that depend on it can help shape the roadmap and prioritise the capabilities they need. If that is you, reach out through the Enterprise Partnerships page or open an issue on GitHub.

Get started

Thank you to everyone who filed issues, tried the snapshots, and pushed for a stable Java release. Stubborn Contract is just getting started. The roadmap includes AsyncAPI contract validation, schema-driven generative testing, and semantic contract diffing. If there is a capability you want, open an issue.

← All posts Read the Transition Guide