{"id":108333,"date":"2021-01-08T10:00:00","date_gmt":"2021-01-08T08:00:00","guid":{"rendered":"https:\/\/www.javacodegeeks.com\/?p=108333"},"modified":"2021-01-05T16:37:29","modified_gmt":"2021-01-05T14:37:29","slug":"spring-cloud-contract-3-0-0-released","status":"publish","type":"post","link":"https:\/\/www.javacodegeeks.com\/2021\/01\/spring-cloud-contract-3-0-0-released.html","title":{"rendered":"Spring Cloud Contract 3.0.0 released"},"content":{"rendered":"<p><span style=\"font-size: inherit;\">With the release of the Spring Cloud 2020.0.0 (aka Ilford) release train we\u2019re more than happy to announce the general availability of Spring Cloud Contract 3.0.0. In this blog post I\u2019ll describe the most notable released features (in order of their release dates).<\/span><\/p>\n<article role=\"article\">\n<h2>Incremental Test Generation for Maven<\/h2>\n<p>With the <a href=\"https:\/\/github.com\/spring-cloud\/spring-cloud-contract\/pull\/1361\">Incremental Test Generation for Maven<\/a> we\u2019re generating tests, stubs and stubs jar only if the contracts have changed. The feature is opt-out (enabled by default).<\/p>\n<h2>Resolves Credentials from settings.xml<\/h2>\n<p>With the <a href=\"https:\/\/github.com\/spring-cloud\/spring-cloud-contract\/pull\/1362\"> support to resolve credentials from settings.xml<\/a> when using Aether based solution to fetch the contracts \/ stubs, we will reuse your <code>settings.xml<\/code> credentials for the given server id (via the <code>stubrunner.server-id <\/code> property).<\/p>\n<h2>Rewrite Groovy to Java<\/h2>\n<p>It was fantastic to see so many people take part in rewriting the Spring Cloud Contract\u2019s codebase from Groovy to Java. You can check <a href=\"https:\/\/github.com\/spring-cloud\/spring-cloud-contract\/issues\/1470\">this issue<\/a> for more information.<\/p>\n<h2>Allow to Extend Contract &amp; Stubs<\/h2>\n<p>With <a href=\"https:\/\/github.com\/spring-cloud\/spring-cloud-contract\/issues\/1465\">this issue<\/a> and this <a href=\"https:\/\/github.com\/spring-cloud\/spring-cloud-contract\/pull\/1466\">pull request<\/a> we\u2019ve added an option to provide <code>metadata<\/code> to your contracts. Since we didn\u2019t want to map all WireMock properties to the core of our Contract definition, we\u2019ve allowed passing of metadata under the <code>wiremock<\/code> key. The passed value can be an actual WireMock definition. We will map that part to the generated stub.<\/p>\n<p>Example of adding delays:<\/p>\n<pre class=\"brush:java\">Contract.make {\n\t\trequest {\n\t\t\tmethod GET()\n\t\t\turl '\/drunks'\n\t\t}\n\t\tresponse {\n\t\t\tstatus OK()\n\t\t\tbody([\n\t\t\t\tcount: 100\n\t\t\t])\n\t\t\theaders {\n\t\t\t\tcontentType(\"application\/json\")\n\t\t\t}\n\t\t}\n\t\tmetadata([wiremock: '''\\\n\t{\n\t\t\"response\" : {\n\t\t\t\"delayDistribution\": {\n                    \"type\": \"lognormal\",\n                    \"median\": 80,\n                    \"sigma\": 0.4\n            }\n\t\t}\n\t}\n'''\n\t\t])<\/pre>\n<p>That also means that you can provide your own metadata. You can read more about this in the documentation<\/p>\n<ul>\n<li><a href=\"https:\/\/docs.spring.io\/spring-cloud-contract\/docs\/3.0.0\/reference\/html\/project-features.html#contract-dsl-metadata\">existing metadata entries<\/a><\/li>\n<li><a href=\"https:\/\/docs.spring.io\/spring-cloud-contract\/docs\/3.0.0\/reference\/htmlsingle\/#customization-wiremock-from-metadata\">customization of WireMock via metadata<\/a><\/li>\n<li><a href=\"https:\/\/docs.spring.io\/spring-cloud-contract\/docs\/3.0.0\/reference\/htmlsingle\/#customization-wiremock-from-metadata-custom-processor\">customization of WireMock via metadata &amp; custom post processor<\/a><\/li>\n<\/ul>\n<h2>New [Custom] Mode of Test Generation<\/h2>\n<p>With <a href=\"https:\/\/github.com\/spring-cloud\/spring-cloud-contract\/pull\/1511\">this pr<\/a> we\u2019ve introduced a new <code>custom<\/code> mode of test generation. You\u2019re able to pass your own implementation of an HTTP client (you can reuse our <code>OkHttpHttpVerifier<\/code>), thanks to which you can e.g. use HTTP\/2. This was a prerequisite for the GRPC task. Thanks to the Spring Cloud Contract Workshops and the following refactoring of Spring Cloud Contract it was quite easy to add this feature, so thanks everyone involved then!<div style=\"display:inline-block; margin: 15px 0;\"> <div id=\"adngin-JavaCodeGeeks_incontent_video-0\" style=\"display:inline-block;\"><\/div> <\/div><\/p>\n<p>You can read more about this in <a href=\"https:\/\/docs.spring.io\/spring-cloud-contract\/docs\/3.0.0\/reference\/html\/project-features.html#features-custom-mode\">the documentation<\/a>.<\/p>\n<h2>Experimental GRPC Support<\/h2>\n<p>With the custom mode in place we could add the experimental GRPC support. Why experimental? Due to GRPC\u2019s tweaking of the HTTP\/2 Header frames, it\u2019s impossible to assert the <code>grpc-status<\/code> header. You can read more about the feature, the issue and workarounds in <a href=\"https:\/\/docs.spring.io\/spring-cloud-contract\/docs\/3.0.0\/reference\/html\/project-features.html#features-grpc\">the documentation<\/a>.<\/p>\n<p>Here you can find an example of <a href=\"https:\/\/github.com\/spring-cloud-samples\/spring-cloud-contract-samples\/tree\/master\/producer_grpc\">GRPC producer<\/a> and of a <a href=\"https:\/\/github.com\/spring-cloud-samples\/spring-cloud-contract-samples\/tree\/master\/consumer_grpc\">GRPC consumer<\/a>.<\/p>\n<h2>GraphQL Support<\/h2>\n<p>With <a href=\"https:\/\/github.com\/spring-cloud\/spring-cloud-contract\/pull\/1506\">this PR<\/a> we\u2019ve added GraphQL support. Since GraphQL is essentially POST to and endpoint with specific body, you can create such a contract and set the proper metadata. You can read more about this in <a href=\"https:\/\/docs.spring.io\/spring-cloud-contract\/docs\/3.0.0\/reference\/html\/project-features.html#features-graphql\">the documentation<\/a>.<\/p>\n<p>Here you can find an example of <a href=\"https:\/\/github.com\/spring-cloud-samples\/spring-cloud-contract-samples\/tree\/master\/producer_graphql\">GraphQL producer<\/a> and of a <a href=\"https:\/\/github.com\/spring-cloud-samples\/spring-cloud-contract-samples\/blob\/master\/consumer\/src\/test\/java\/com\/example\/BeerControllerGraphQLTest.java\">GraphQL consumer<\/a>.<\/p>\n<h2>Stub Runner Boot Thin JAR<\/h2>\n<p>With <a href=\"https:\/\/github.com\/spring-cloud\/spring-cloud-contract\/issues\/1385\">this issue<\/a> we\u2019ve migrated the Stub Runner Boot application to be a thin jar based application. Not only have we managed to lower the size of the produced artifact, but also we\u2019re able via properties turn on profiles (e.g. <code>kafka<\/code> or <code>rabbit<\/code> profiles) that would fetch additional dependencies at runtime.<\/p>\n<h2>Messaging Polyglot Support<\/h2>\n<h3>Pre-built kafka and amqp support<\/h3>\n<p>With the thin jar rewrite and <a href=\"https:\/\/github.com\/spring-cloud\/spring-cloud-contract\/pull\/1472\">this PR<\/a> and <a href=\"https:\/\/github.com\/spring-cloud\/spring-cloud-contract\/issues\/1468\">this issue<\/a> we\u2019re adding support for Kafka and AMQP based solutions with the Docker images.<\/p>\n<p>You\u2019ll have to have the following prerequisites met:<\/p>\n<ul>\n<li>Middleware (e.g. RabbitMQ or Kafka) must be running before generating tests<\/li>\n<li>Your contract needs to call a method <code>triggerMessage(...)<\/code> with a String parameter that is equal to the contract\u2019s label.<\/li>\n<li>Your application needs to have a HTTP endpoint via which we can trigger a message<\/li>\n<li>That endpoint should not be available on production (could be enabled via an environment variable)<\/li>\n<\/ul>\n<p>Your contract can leverage the <code>kafka<\/code> and <code>amqp<\/code> metadata sections like below:<\/p>\n<pre class=\"brush:java\">description: 'Send a pong message in response to a ping message'\nlabel: 'ping_pong'\ninput:\n    # You have to provide the `triggerMessage` method with the `label`\n    # as a String parameter of the method\n    triggeredBy: 'triggerMessage(\"ping_pong\")'\noutputMessage:\n    sentTo: 'output'\n    body:\n        message: 'pong'\nmetadata:\n    amqp:\n        outputMessage:\n            connectToBroker:\n                declareQueueWithName: \"queue\"\n            messageProperties:\n\t\t\t\treceivedRoutingKey: '#'<\/pre>\n<h3>Standalone mode<\/h3>\n<p>There is legitimate reason to run your contract tests against existing middleware. Some testing frameworks might give you false positive results &#8211; the test within your build passes whereas on production the communication fails.<\/p>\n<p>In Spring Cloud Contract docker images we give an option to connect to existing middleware. As presented in previous subsections we do support Kafka and RabbitMQ out of the box. However, via <a href=\"https:\/\/camel.apache.org\/components\/latest\/index.html\">Apache Camel Components<\/a> we can support other middleware too. Let\u2019s take a look at the following examples of usage.<\/p>\n<p>Example of a contract connecting to a real RabbitMQ instance:<\/p>\n<pre class=\"brush:java\">description: 'Send a pong message in response to a ping message'\nlabel: 'standalone_ping_pong'\ninput:\n  triggeredBy: 'triggerMessage(\"ping_pong\")'\noutputMessage:\n  sentTo: 'rabbitmq:output'\n  body:\n    message: 'pong'\nmetadata:\n  standalone:\n    setup:\n      options: rabbitmq:output?queue=output&amp;routingKey=#\n    outputMessage:\n\t  additionalOptions: routingKey=#&amp;queue=output<\/pre>\n<p>You can read more about setting this up in <a href=\"https:\/\/github.com\/spring-cloud\/spring-cloud-contract\/pull\/1472\">this PR<\/a> under the <code>Documentation of the feature with standalone mode (aka with running middleware)<\/code> section.<\/p>\n<h2>Messaging with Existing Middleware<\/h2>\n<p>Since it\u2019s extremely easy to start a docker image with a broker via <a href=\"https:\/\/testcontainers.org\">Testcontainers<\/a>, we\u2019re suggesting to slowly migrate your messaging tests to such an approach. From the perspective of Spring Cloud Contract it\u2019s also better since we won\u2019t need to replicate in our code the special cases of how frameworks behave when calling a real broker. Here you can find an example of how you can connect to a JMS broker on <a href=\"https:\/\/github.com\/spring-cloud-samples\/spring-cloud-contract-samples\/tree\/master\/producer_jms_middleware\">the producer side<\/a> and <a href=\"https:\/\/github.com\/spring-cloud-samples\/spring-cloud-contract-samples\/tree\/master\/producer_jms_middleware\">here how you can consume it<\/a>.<\/p>\n<h2>Gradle Plugin rewrite<\/h2>\n<p>This one is fully done by the one and only <a href=\"https:\/\/github.com\/shanman190\">shanman190<\/a>. The whole work on the Gradle plugin was done by him so you should buy him a beer once you get to see him :) Anyways, there are various changes to the Gradle plugin that you can check out.<\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/spring-cloud\/spring-cloud-contract\/pull\/1464\">Disable the stubs jar publication by default<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/spring-cloud\/spring-cloud-contract\/pull\/1558\">Attempt to keep Kotlin off the classpath<\/a><\/li>\n<\/ul>\n<div class=\"attribution\">\n<table>\n<tbody>\n<tr>\n<td>Published on Java Code Geeks with permission by Marcin Grzejszczak, partner at our <a href=\"\/\/www.javacodegeeks.com\/join-us\/jcg\/\" target=\"_blank\" rel=\"noopener\">JCG program<\/a>. See the original article here: <a href=\"https:\/\/toomuchcoding.com\/articles\/2020\/12\/23\/spring-cloud-contract-3-0-0-released\/\" target=\"_blank\" rel=\"noopener\">Spring Cloud Contract 3.0.0 released<\/a><\/p>\n<p>Opinions expressed by Java Code Geeks contributors are their own.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/article>\n","protected":false},"excerpt":{"rendered":"<p>With the release of the Spring Cloud 2020.0.0 (aka Ilford) release train we\u2019re more than happy to announce the general availability of Spring Cloud Contract 3.0.0. In this blog post I\u2019ll describe the most notable released features (in order of their release dates). Incremental Test Generation for Maven With the Incremental Test Generation for Maven &hellip;<\/p>\n","protected":false},"author":417,"featured_media":112,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[992],"class_list":["post-108333","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-enterprise-java","tag-spring-cloud"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Spring Cloud Contract 3.0.0 released - Java Code Geeks<\/title>\n<meta name=\"description\" content=\"With the release of the Spring Cloud 2020.0.0 (aka Ilford) release train we\u2019re more than happy to announce the general availability of Spring Cloud\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.javacodegeeks.com\/2021\/01\/spring-cloud-contract-3-0-0-released.html\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Spring Cloud Contract 3.0.0 released - Java Code Geeks\" \/>\n<meta property=\"og:description\" content=\"With the release of the Spring Cloud 2020.0.0 (aka Ilford) release train we\u2019re more than happy to announce the general availability of Spring Cloud\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.javacodegeeks.com\/2021\/01\/spring-cloud-contract-3-0-0-released.html\" \/>\n<meta property=\"og:site_name\" content=\"Java Code Geeks\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/javacodegeeks\" \/>\n<meta property=\"article:author\" content=\"http:\/\/www.facebook.com\/TooMuchCoding\" \/>\n<meta property=\"article:published_time\" content=\"2021-01-08T08:00:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"150\" \/>\n\t<meta property=\"og:image:height\" content=\"150\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Marcin Grzejszczak\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@http:\/\/twitter.com\/MGrzejszczak\" \/>\n<meta name=\"twitter:site\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Marcin Grzejszczak\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2021\\\/01\\\/spring-cloud-contract-3-0-0-released.html#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2021\\\/01\\\/spring-cloud-contract-3-0-0-released.html\"},\"author\":{\"name\":\"Marcin Grzejszczak\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/c4d5fb6575182ae8a42411f4947c6b54\"},\"headline\":\"Spring Cloud Contract 3.0.0 released\",\"datePublished\":\"2021-01-08T08:00:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2021\\\/01\\\/spring-cloud-contract-3-0-0-released.html\"},\"wordCount\":937,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2021\\\/01\\\/spring-cloud-contract-3-0-0-released.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/enterprise-java-logo.jpg\",\"keywords\":[\"Spring Cloud\"],\"articleSection\":[\"Enterprise Java\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2021\\\/01\\\/spring-cloud-contract-3-0-0-released.html#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2021\\\/01\\\/spring-cloud-contract-3-0-0-released.html\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2021\\\/01\\\/spring-cloud-contract-3-0-0-released.html\",\"name\":\"Spring Cloud Contract 3.0.0 released - Java Code Geeks\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2021\\\/01\\\/spring-cloud-contract-3-0-0-released.html#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2021\\\/01\\\/spring-cloud-contract-3-0-0-released.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/enterprise-java-logo.jpg\",\"datePublished\":\"2021-01-08T08:00:00+00:00\",\"description\":\"With the release of the Spring Cloud 2020.0.0 (aka Ilford) release train we\u2019re more than happy to announce the general availability of Spring Cloud\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2021\\\/01\\\/spring-cloud-contract-3-0-0-released.html#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2021\\\/01\\\/spring-cloud-contract-3-0-0-released.html\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2021\\\/01\\\/spring-cloud-contract-3-0-0-released.html#primaryimage\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/enterprise-java-logo.jpg\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/enterprise-java-logo.jpg\",\"width\":150,\"height\":150,\"caption\":\"java-interview-questions-answers\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2021\\\/01\\\/spring-cloud-contract-3-0-0-released.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Java\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/java\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Enterprise Java\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/java\\\/enterprise-java\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Spring Cloud Contract 3.0.0 released\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"name\":\"Java Code Geeks\",\"description\":\"Java Developers Resource Center\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"alternateName\":\"JCG\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.javacodegeeks.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\",\"name\":\"Exelixis Media P.C.\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"width\":864,\"height\":246,\"caption\":\"Exelixis Media P.C.\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/javacodegeeks\",\"https:\\\/\\\/x.com\\\/javacodegeeks\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/c4d5fb6575182ae8a42411f4947c6b54\",\"name\":\"Marcin Grzejszczak\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1cda3e9f5bb5ca536ed2d4dd27e82290dd1ab3566c586a6b6be9eed159b7fe1e?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1cda3e9f5bb5ca536ed2d4dd27e82290dd1ab3566c586a6b6be9eed159b7fe1e?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1cda3e9f5bb5ca536ed2d4dd27e82290dd1ab3566c586a6b6be9eed159b7fe1e?s=96&d=mm&r=g\",\"caption\":\"Marcin Grzejszczak\"},\"description\":\"Senior Java Developer with team building and managing skills. Enthusiast of JVM languages (Groovy, Scala) and clean coding\",\"sameAs\":[\"http:\\\/\\\/toomuchcoding.com\\\/\",\"http:\\\/\\\/www.facebook.com\\\/TooMuchCoding\",\"http:\\\/\\\/www.linkedin.com\\\/pub\\\/marcin-grzejszczak\\\/19\\\/651\\\/155\",\"https:\\\/\\\/x.com\\\/http:\\\/\\\/twitter.com\\\/MGrzejszczak\"],\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/author\\\/marcin-grzejszczak\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Spring Cloud Contract 3.0.0 released - Java Code Geeks","description":"With the release of the Spring Cloud 2020.0.0 (aka Ilford) release train we\u2019re more than happy to announce the general availability of Spring Cloud","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.javacodegeeks.com\/2021\/01\/spring-cloud-contract-3-0-0-released.html","og_locale":"en_US","og_type":"article","og_title":"Spring Cloud Contract 3.0.0 released - Java Code Geeks","og_description":"With the release of the Spring Cloud 2020.0.0 (aka Ilford) release train we\u2019re more than happy to announce the general availability of Spring Cloud","og_url":"https:\/\/www.javacodegeeks.com\/2021\/01\/spring-cloud-contract-3-0-0-released.html","og_site_name":"Java Code Geeks","article_publisher":"https:\/\/www.facebook.com\/javacodegeeks","article_author":"http:\/\/www.facebook.com\/TooMuchCoding","article_published_time":"2021-01-08T08:00:00+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg","type":"image\/jpeg"}],"author":"Marcin Grzejszczak","twitter_card":"summary_large_image","twitter_creator":"@http:\/\/twitter.com\/MGrzejszczak","twitter_site":"@javacodegeeks","twitter_misc":{"Written by":"Marcin Grzejszczak","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.javacodegeeks.com\/2021\/01\/spring-cloud-contract-3-0-0-released.html#article","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/2021\/01\/spring-cloud-contract-3-0-0-released.html"},"author":{"name":"Marcin Grzejszczak","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/c4d5fb6575182ae8a42411f4947c6b54"},"headline":"Spring Cloud Contract 3.0.0 released","datePublished":"2021-01-08T08:00:00+00:00","mainEntityOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2021\/01\/spring-cloud-contract-3-0-0-released.html"},"wordCount":937,"commentCount":0,"publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2021\/01\/spring-cloud-contract-3-0-0-released.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg","keywords":["Spring Cloud"],"articleSection":["Enterprise Java"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.javacodegeeks.com\/2021\/01\/spring-cloud-contract-3-0-0-released.html#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.javacodegeeks.com\/2021\/01\/spring-cloud-contract-3-0-0-released.html","url":"https:\/\/www.javacodegeeks.com\/2021\/01\/spring-cloud-contract-3-0-0-released.html","name":"Spring Cloud Contract 3.0.0 released - Java Code Geeks","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2021\/01\/spring-cloud-contract-3-0-0-released.html#primaryimage"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2021\/01\/spring-cloud-contract-3-0-0-released.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg","datePublished":"2021-01-08T08:00:00+00:00","description":"With the release of the Spring Cloud 2020.0.0 (aka Ilford) release train we\u2019re more than happy to announce the general availability of Spring Cloud","breadcrumb":{"@id":"https:\/\/www.javacodegeeks.com\/2021\/01\/spring-cloud-contract-3-0-0-released.html#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.javacodegeeks.com\/2021\/01\/spring-cloud-contract-3-0-0-released.html"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/2021\/01\/spring-cloud-contract-3-0-0-released.html#primaryimage","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg","width":150,"height":150,"caption":"java-interview-questions-answers"},{"@type":"BreadcrumbList","@id":"https:\/\/www.javacodegeeks.com\/2021\/01\/spring-cloud-contract-3-0-0-released.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.javacodegeeks.com\/"},{"@type":"ListItem","position":2,"name":"Java","item":"https:\/\/www.javacodegeeks.com\/category\/java"},{"@type":"ListItem","position":3,"name":"Enterprise Java","item":"https:\/\/www.javacodegeeks.com\/category\/java\/enterprise-java"},{"@type":"ListItem","position":4,"name":"Spring Cloud Contract 3.0.0 released"}]},{"@type":"WebSite","@id":"https:\/\/www.javacodegeeks.com\/#website","url":"https:\/\/www.javacodegeeks.com\/","name":"Java Code Geeks","description":"Java Developers Resource Center","publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"alternateName":"JCG","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.javacodegeeks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.javacodegeeks.com\/#organization","name":"Exelixis Media P.C.","url":"https:\/\/www.javacodegeeks.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","width":864,"height":246,"caption":"Exelixis Media P.C."},"image":{"@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/javacodegeeks","https:\/\/x.com\/javacodegeeks"]},{"@type":"Person","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/c4d5fb6575182ae8a42411f4947c6b54","name":"Marcin Grzejszczak","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/1cda3e9f5bb5ca536ed2d4dd27e82290dd1ab3566c586a6b6be9eed159b7fe1e?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1cda3e9f5bb5ca536ed2d4dd27e82290dd1ab3566c586a6b6be9eed159b7fe1e?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1cda3e9f5bb5ca536ed2d4dd27e82290dd1ab3566c586a6b6be9eed159b7fe1e?s=96&d=mm&r=g","caption":"Marcin Grzejszczak"},"description":"Senior Java Developer with team building and managing skills. Enthusiast of JVM languages (Groovy, Scala) and clean coding","sameAs":["http:\/\/toomuchcoding.com\/","http:\/\/www.facebook.com\/TooMuchCoding","http:\/\/www.linkedin.com\/pub\/marcin-grzejszczak\/19\/651\/155","https:\/\/x.com\/http:\/\/twitter.com\/MGrzejszczak"],"url":"https:\/\/www.javacodegeeks.com\/author\/marcin-grzejszczak"}]}},"_links":{"self":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/108333","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/users\/417"}],"replies":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/comments?post=108333"}],"version-history":[{"count":0,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/108333\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media\/112"}],"wp:attachment":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media?parent=108333"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/categories?post=108333"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/tags?post=108333"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}