Skip to main content

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-limit to 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 to 0 temporarily disables version updates for that package-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 in ch.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.gfw group 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-final class — 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 the start() call to a separate method callers invoke after construction, or declare the class final.
  • org.openrewrite.java.migrate.lombok.AddStopBubblingToLombokConfig: Append config.stopBubbling = true to the root lombok.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 a lombok.config in 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.config into the root lombok.config and delete the nested files, so that a project has a single place where Lombok is configured. A root lombok.config is created when the project has none. Directives are appended to the root file; what it already declares, itself or through an import, 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 as lombok.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 declares config.stopBubbling, import, clear or -=, when a lombok.config between it and the root would outrank the root once the directive moved there, when another lombok.config imports 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>.flagUsage in every lombok.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), and Runtime.halt(int). Terminating the JVM from library or application code is rarely correct: it bypasses the normal shutdown flow, prevents finally blocks from running in other threads, and can leave file, socket, and database resources in an inconsistent state. Runtime.halt is particularly dangerous because it also skips shutdown hooks.
  • org.openrewrite.staticanalysis.FindThreadGroupUsages: Marks uses of java.lang.ThreadGroup. ThreadGroup was 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 by java.util.concurrent.ExecutorService. Sites flagged include new ThreadGroup(...) constructor calls, calls to Thread.getThreadGroup(), and method invocations on ThreadGroup receivers.
  • org.openrewrite.staticanalysis.FindWaitWithMultipleLocksHeld: Finds zero-argument Object.wait() invocations whose enclosing method holds two or more monitors — either through nested synchronized (...) blocks, or a synchronized method combined with a nested synchronized block. 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 final modifier from resources declared in a try-with-resources statement. Such resources are implicitly final, so the modifier adds no meaning.