8.91.0 release (2026-08-26)
Total recipe count: 4142
info
This changelog only shows what recipes have been added, removed, or changed. OpenRewrite may do releases that do not include these types of changes. To see these changes, please go to the releases page.
Corresponding CLI version
- CLI version
4.7.0
Removed Artifacts
- rewrite-analysis
New Recipes
- io.quarkus.updates.core.quarkus339.ChangeGradleAnnotationProcessorDependency: Change the groupId and artifactId of a Gradle annotation processor dependency, remove any explicit version, and add an enforcedPlatform for the Quarkus BOM if the old dependency had a version and no platform was present.
- io.quarkus.updates.core.quarkus339.QuarkusDataHibernateRenames: Migrate from
io.quarkus.hibernate.panachetoio.quarkus.data.hibernatepackage and rename Panache types to Quarkus Data types. - io.quarkus.updates.core.quarkus339.ReplaceHibernateProcessorAnnotationProcessor:
- io.quarkus.updates.core.quarkus339.ReplaceNewJpaModelgenAnnotationProcessor:
- io.quarkus.updates.core.quarkus339.ReplaceOldJpaModelgenAnnotationProcessor:
- org.openrewrite.apache.ApacheBestPractices: Apply best practices to code that uses Apache libraries. This migrates Apache Commons, HttpClient and POI off their end-of-life major versions, replaces deprecated APIs with their supported replacements, and prefers the Java standard library where it now offers an equivalent.
- org.openrewrite.apache.commons.ApacheCommonsBestPractices: Apply best practices to code that uses Apache Commons libraries: migrate off the end-of-life Commons Lang 2.x, Commons Collections 3.x and Commons Math 2.x major versions, correct the
commons-iocoordinates, replace deprecated APIs with their supported replacements, make character encodings explicit, and prefer the Java standard library where it now offers an equivalent. - org.openrewrite.github.AddMergeGroupTrigger: Trigger workflows for pull requests queued in a merge queue.
- org.openrewrite.github.IsGitHubActionsFile: Checks if the file is either a GitHub Actions workflow file, or a GitHub Action definition (
action.yml). Steps, and theuses:references within them, appear in both, so prefer this overIsGitHubActionsWorkflowas a precondition for any recipe that operates on steps. Recipes that read workflow-only keys such ason:,permissions:,runs-on:orneeds:should keep the narrowerIsGitHubActionsWorkflow. - org.openrewrite.github.ReplaceAlwaysWithSuccessOrFailure: Replace
always()in GitHub Actions job and step conditions withsuccess() || failure()so that canceled workflows do not continue running or hang until they time out. Note that teardown steps deliberately usingalways()to still run on cancellation will no longer run. - org.openrewrite.github.ReplaceDependabotReviewersWithCodeowners: Replaces the removed
reviewersoption in.github/dependabot.ymlwith equivalentCODEOWNERSentries. Each reviewer is mapped onto the manifest files Dependabot updates for thatpackage-ecosystemanddirectory, so ownership stays as narrow as the Dependabot configuration was. Update entries whosepackage-ecosystemhas no known manifests are left untouched. - org.openrewrite.github.SetupPythonUpgradePythonVersion: Update the Python version used by
actions/setup-pythonif it is below the expected version number. - org.openrewrite.java.migrate.DanglingDocCommentToBlockComment: A documentation comment that does not precede a declaration documents nothing, and since Java 22
-Xlint:dangling-doc-commentswarns about it, which fails any build using-Werror. Changing/**to/*keeps the text and silences the warning. A documentation comment that is attached to a declaration is left alone. - org.openrewrite.java.netty.upgrade.3_2_to_4_1.ChangeMessageEventParameterToObject: Replaces the
MessageEventparameter ofchannelReadhandler methods withObject, as Netty 4 passes the message itself rather than an event. - org.openrewrite.java.recipes.InlineNestedVisitorClass: Recipes that return a named, private, static nested visitor class straight from
getVisitor()(orgetScanner()) can declare that visitor anonymously instead, which keeps the visitor next to the recipe metadata that configures it. Anyprivate static finalconstants the nested class declares are hoisted onto the recipe class, as anonymous classes can not declare them. Only applied when the nested class is used exactly once, and when nothing would be lost by inlining it. - org.openrewrite.java.spring.boot4.AddModularStarterDependencies: Adds the Spring Boot 4.0 modular starter dependencies implied by a module's Spring Boot 3 package usage, without relocating any source. Split out from
MigrateToModularStartersso that it can be sequenced ahead ofMigrateAutoconfigurePackageswhen composed into a larger migration. - org.openrewrite.java.spring.doc.NormalizeSpringfoxPathSelectorsRegexToAnt: Springdoc's
GroupedOpenApi.pathsToMatch(...)accepts Ant-style patterns, not Java regex. This recipe rewritesPathSelectors.regex(...)calls whose literal argument is a literal path prefix followed by.*(optionally anchored with^/$) into the equivalentPathSelectors.ant(...)call, so downstream Docket-to-GroupedOpenApi migration can translate the path. Regex patterns that use metacharacters, alternation, or character classes are left unchanged. - org.openrewrite.java.spring.framework.MoveConnectTimeoutToConnectionConfig: Moves
setConnectTimeout(int)to the Apache HttpClientConnectionConfigwhen the localPoolingHttpClientConnectionManageris used by theHttpComponentsClientHttpRequestFactory. - org.openrewrite.java.testing.junit5.JUnitSoftAssertionsToSoftAssertionsExtension: Replaces
@Rulefields of typeJUnitSoftAssertionsorJUnitBDDSoftAssertionswith@InjectSoftAssertionsfields, and registers@ExtendWith(SoftAssertionsExtension.class)on the test class. JUnit Jupiter does not run JUnit 4 rules, so soft assertions collected through such a rule would otherwise never be reported, silently passing tests that ought to fail. - org.openrewrite.json.RemoveEmptyKeys: Remove mapping entries whose value is an empty object or array, such as those left behind by
DeleteKey. Entries are removed from the inside out, so a chain of objects holding nothing but the removed entry is removed entirely. Array elements are left alone, since removing one shifts the indexes of its siblings. - org.openrewrite.quarkus.MigrateToQuarkus_v3_39_0: Quarkus update recipes to upgrade your application to 3.39.0.
- org.openrewrite.staticanalysis.RemoveDuplicateAnnotations: Remove annotations that are repeated on the same element, keeping only the first occurrence. Duplicates typically arise when several distinct annotations are migrated to a single new annotation, such as when both
javax.annotation.Nullableandjavax.annotation.CheckForNullbecomeorg.jspecify.annotations.Nullable.@Repeatableannotations are left alone, as repeating those is meaningful. - org.openrewrite.staticanalysis.RemoveNoArgumentSuperConstructorCall: The compiler inserts a call to the no argument constructor of the super class when a constructor does not start with an explicit
this()orsuper(..)call, which makes writing outsuper();redundant. - org.openrewrite.staticanalysis.UseMapEntrySetIteration: A loop over
map.keySet()that callsmap.get(key)hashes and probes the map again for every element, which on aTreeMapcosts an extraO(log n)lookup per iteration. Iteratingmap.entrySet()instead hands the loop both the key and the value. The loop is only rewritten when:
- The map is a simple reference that is neither modified nor reassigned inside the loop.
getis called only with the loop variable.- The loop variable is neither reassigned nor captured by a lambda or anonymous class.
Every candidate loop, converted or not, is recorded in a data table along with the reason it was left alone.
- sh.stubborn.contract.migration.DropJUnit4Support: Replaces @Rule StubRunnerRule / StubRunnerClassRule with @RegisterExtension StubRunnerExtension (JUnit 5). Requires JUnit 5 on the test classpath.
- sh.stubborn.contract.migration.MigrateFromSpringCloudContract: Composite recipe that updates Maven/Gradle coordinates, Java package names, and drops JUnit 4 StubRunner / Verifier usage. Run this after adding stubborn-contract-migration to your build's rewrite plugin configuration.
- sh.stubborn.contract.migration.MigrateStubRunnerProperties: Renames the deprecated Stub Runner property prefix spring.cloud.contract.stubrunner.* to its canonical stubborn.contract.stubrunner.* equivalent in Spring Boot application.properties and application.yml/yaml files. The legacy prefix still resolves at runtime via StubRunnerPropertiesMigrator, but it emits deprecation warnings and is slated for removal in the next major release; this recipe removes the warnings by rewriting the keys. The verifier property subset is handled separately by MigrateVerifierProperties.
- sh.stubborn.contract.migration.MigrateVerifierProperties: Renames the deprecated Verifier property prefix spring.cloud.contract.verifier.* to its canonical stubborn.contract.verifier.* equivalent in Spring Boot application.properties and application.yml/yaml files. The Stubborn Contract Maven plugin exposes these as -Dstubborn.contract.verifier.* system properties; the legacy names are still accepted for the string parameters and via this recipe for configuration files, and are slated for removal in the next major release.
- sh.stubborn.contract.migration.RenameJavaPackages: Recursively rewrites all Java import statements from org.springframework.cloud.contract.* to sh.stubborn.contract., and the JSON/XML assertion packages from com.toomuchcoding. to sh.stubborn.*.
- sh.stubborn.contract.migration.UpdateDependencies: Replaces org.springframework.cloud:spring-cloud-contract-* GAVs with sh.stubborn:stubborn-* equivalents, migrates the spring-cloud-contract-dependencies BOM, and swaps both build plugins, in Maven and Gradle builds alike. The com.toomuchcoding JSON/XML assertion coordinates are swapped alongside the sh.stubborn.jsonassert / sh.stubborn.xmlassert package renames. Every coordinate is repinned to latest.release.
Removed Recipes
- org.openrewrite.java.micronaut.RemoveUnnecessaryDependencies: This recipe will remove dependencies that are no longer explicitly needed.
- org.openrewrite.java.migrate.guava.NoGuavaAtomicsNewReference: Prefer the Java standard library over third-party usage of Guava in simple cases like this.
Changed Recipes
- org.openrewrite.github.AutoCancelInProgressWorkflow was changed:
- Old Options:
accessToken: { type: String, required: false }
- New Options:
None
- Old Options:
- org.openrewrite.github.ChangeAction was changed:
- Old Options:
newAction: { type: String, required: true }newVersion: { type: String, required: true }oldAction: { type: String, required: true }oldSha: { type: String, required: false }
- New Options:
newAction: { type: String, required: true }newVersion: { type: String, required: false }oldAction: { type: String, required: true }oldSha: { type: String, required: false }
- Old Options:
- org.openrewrite.github.ChangeDependabotScheduleInterval was changed:
- Old Options:
interval: { type: String, required: true }packageEcosystem: { type: String, required: true }
- New Options:
day: { type: String, required: false }interval: { type: String, required: true }packageEcosystem: { type: String, required: true }time: { type: String, required: false }timezone: { type: String, required: false }
- Old Options:
- org.openrewrite.json.DeleteKey was changed:
- Old Options:
deleteEmptyParents: { type: Boolean, required: false }keyPath: { type: String, required: true }
- New Options:
keyPath: { type: String, required: true }
- Old Options: