8.92.8 release (2026-09-24)
Total recipe count: 4183
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.8.8
New Recipes
- org.openrewrite.github.AddDependabotOpenPullRequestsLimit: Adds an
open-pull-requests-limitto each update configuration in Dependabot files, and replaces an existing value when it differs. The option caps the number of version update pull requests Dependabot keeps open; setting it to0temporarily disables version updates for thatpackage-ecosystem. Security update pull requests are not subject to this limit and do not count towards it. The available configuration options for dependabot are listed on GitHub. - org.openrewrite.java.logging.logback.ConditionAttributeToConditionElement: Logback 1.5.37 removed the Janino based
<if condition="...">attribute that 1.5.20 deprecated, so configuration files still using it fail to select the intended appenders. Replaces the attribute with the<condition class="..."/>element that precedes<if>, using the conditions shipped inch.qos.logback.core.boolex. Conditions that require custom Java logic are left unchanged and reported in a data table. - org.openrewrite.java.migrate.javax.MigrateOneGfwJaxbDependencies: The
one.gfwgroup republishes unmodified copies of the JAXB API and runtime artifacts under its own group ID. This recipe replaces them with the official artifacts they were copied from, so that subsequent JAXB and Jakarta migrations recognize them. - org.openrewrite.java.migrate.lang.FindThreadStartInConstructor: Finds
Thread.start()invocations reached during construction of a non-finalclass — from a constructor body, an instance field initializer, or an instance initializer block. Starting a thread before construction completes lets the new thread observe a partially-initialised object; the problem is compounded when a subclass extends the class, because the superclass constructor starts the thread before the subclass' own fields have been initialised. Move thestart()call to a separate method callers invoke after construction, or declare the classfinal. - org.openrewrite.java.migrate.lombok.AddStopBubblingToLombokConfig: Append
config.stopBubbling = trueto the rootlombok.config, so that Lombok reads the project's configuration and nothing else. Lombok resolves a key by walking up from the directory of the Java file it is compiling and does not stop at the project, so without this key alombok.configin a parent directory of the checkout takes part in the build. Note that this cuts the project off from such a file whether or not it was meant to be read. Nothing is added when the key is already declared, whatever value it is assigned or whether the root file declares it or imports it. - org.openrewrite.java.migrate.lombok.ConsolidateLombokConfig: Merge the directives of every nested
lombok.configinto the rootlombok.configand delete the nested files, so that a project has a single place where Lombok is configured. A rootlombok.configis created when the project has none. Directives are appended to the root file; what it already declares, itself or through animport, is left as written and not repeated. Note that hoisting a directive widens its scope from the directory that declared it to the whole project, so a directive only some directories can satisfy, such aslombok.val.flagUsage = error, will start to apply to all of them. A nested file is left in place when moving its directives would change what Lombok does: when it declaresconfig.stopBubbling,import,clearor-=, when alombok.configbetween it and the root would outrank the root once the directive moved there, when anotherlombok.configimports it, or when no Java source sits at or below it. No changes are made at all when two files assign conflicting values to the same key, or when the root imports a file that is not among the sources. - org.openrewrite.java.migrate.lombok.FlagUsage: Assign
lombok.<featureName>.flagUsagein everylombok.config, so that Lombok fails the build, or warns, where the feature is used. Nested configs are written to as well, as those have the last word on the directories below them. - org.openrewrite.quarkus.MigrateToQuarkus_v3_16_0: Quarkus update recipes to upgrade your application to 3.16.0.
- org.openrewrite.quarkus.MigrateToQuarkus_v3_20_0: Quarkus update recipes to upgrade your application to 3.20.0.
- org.openrewrite.staticanalysis.FindSystemAndRuntimeExitCalls: Marks calls to
System.exit(int),Runtime.exit(int), andRuntime.halt(int). Terminating the JVM from library or application code is rarely correct: it bypasses the normal shutdown flow, preventsfinallyblocks from running in other threads, and can leave file, socket, and database resources in an inconsistent state.Runtime.haltis particularly dangerous because it also skips shutdown hooks. - org.openrewrite.staticanalysis.FindThreadGroupUsages: Marks uses of
java.lang.ThreadGroup.ThreadGroupwas originally intended to help with thread management but its API has serious design flaws (most methods are either deprecated or unsafe) and it has been superseded byjava.util.concurrent.ExecutorService. Sites flagged includenew ThreadGroup(...)constructor calls, calls toThread.getThreadGroup(), and method invocations onThreadGroupreceivers. - org.openrewrite.staticanalysis.FindWaitWithMultipleLocksHeld: Finds zero-argument
Object.wait()invocations whose enclosing method holds two or more monitors — either through nestedsynchronized (...)blocks, or asynchronizedmethod combined with a nestedsynchronizedblock.wait()releases only the monitor of its receiver, so other held monitors continue to block their waiters and can deadlock. Timed waits (wait(long),wait(long, int)) are intentionally excluded — sonar-java's S3046 does the same, since timed waits are self-releasing and less likely to cause the failure mode. - org.openrewrite.staticanalysis.UnnecessaryFinalInTryWithResources: Remove the redundant
finalmodifier from resources declared in a try-with-resources statement. Such resources are implicitly final, so the modifier adds no meaning.