8.77.0 release (2026-03-25)
Total recipe count: 4244
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.
New Recipes
- org.openrewrite.csharp.AddNuGetPackageReference: Adds a
<PackageReference>element to .csproj files if not already present. - org.openrewrite.csharp.ChangeDotNetTargetFramework: Changes the
<TargetFramework>or<TargetFrameworks>value in .csproj files. For multi-TFM projects, replaces the matching framework within the semicolon-delimited list. - org.openrewrite.csharp.RemoveNuGetPackageReference: Removes a
<PackageReference>element from .csproj files. - org.openrewrite.csharp.UpgradeNuGetPackageVersion: Upgrades the version of a NuGet
<PackageReference>or<PackageVersion>in .csproj and Directory.Packages.props files. Handles property references by updating the property value instead of the version attribute. Supports semver version selectors. - org.openrewrite.gitlab.MigrateToRules: Replace the deprecated
onlyandexceptkeywords with equivalentrulesin.gitlab-ci.ymljob definitions. When bothonlyandexceptare present, they are combined into a singlerulesblock. Handles simple ref list forms; complex object forms withrefs,variables, orchangessub-keys are left unchanged. - org.openrewrite.gradle.ChangeTaskToTasksRegister: Changes eager task creation
task exampleName(type: ExampleType)to lazy registrationtasks.register("exampleName", ExampleType). Also supports Kotlin DSL:task<ExampleType>("exampleName")totasks.register<ExampleType>("exampleName"). - org.openrewrite.java.jackson.AddJsonCreatorToPrivateConstructors: Jackson 3 strictly enforces creator visibility rules. Non-public constructors in Jackson-annotated classes that were auto-detected in Jackson 2 need an explicit
@JsonCreatorannotation to work for deserialization in Jackson 3. - org.openrewrite.java.jackson.LombokJacksonizedConfig: When
@Jacksonizedis used, Lombok generates Jackson annotations. By default it generates Jackson 2.x annotations. This recipe addslombok.jacksonized.jacksonVersion = 3tolombok.configso Lombok generates Jackson 3 compatible annotations. - org.openrewrite.java.jackson.MigrateMapperSettersToBuilder: In Jackson 3,
JsonMapperis immutable. Configuration methods likesetFilterProvider,addMixIn,disable,enable, etc. must be called on the builder instead. This recipe migrates setter calls to the builder pattern when safe, or adds TODO comments when automatic migration is not possible. - org.openrewrite.java.jackson.ReplaceObjectMapperCopy: In Jackson 3,
ObjectMapper.copy()was removed. Usemapper.rebuild().build()instead. - org.openrewrite.java.jackson.StdDeserializerNullConstructor: In Jackson 3,
StdDeserializerno longer acceptsnullfor the handled type parameter. This recipe replacesthis(null)andsuper((Class<?>) null)inStdDeserializersubclass constructors with the actual type parameter from the class declaration. - org.openrewrite.java.jackson.UpgradeJackson_2_3_RelocatedFeatureConstants: Jackson 3 moved date/time-related feature constants from
SerializationFeatureandDeserializationFeatureintoDateTimeFeature, and enum-related constants intoEnumFeature. - org.openrewrite.java.micronaut.RemoveUnusedInConfigFiles: Remove empty YAML keys left behind after relocating security config keys.
- org.openrewrite.java.migrate.JavaBestPractices: Applies opinionated best practices for Java projects targeting Java 25. This recipe includes the full Java 25 upgrade chain plus additional improvements to code style, API usage, and third-party dependency reduction that go beyond what the version migration recipes apply.
- org.openrewrite.java.migrate.datanucleus.DataNucleusPackageMoves_4_0: Relocate packages that were moved in DataNucleus 4.0.
- org.openrewrite.java.migrate.datanucleus.DataNucleusPackageMoves_5_0: Relocate packages that were moved in DataNucleus 5.0.
- org.openrewrite.java.migrate.datanucleus.DataNucleusPackageMoves_5_2: Relocate packages that were moved in DataNucleus 5.2.
- org.openrewrite.java.migrate.datanucleus.DataNucleusProperties_4_0: Rename property keys that changed in DataNucleus 4.0.
- org.openrewrite.java.migrate.datanucleus.DataNucleusProperties_5_0: Rename property keys that changed in DataNucleus 5.0.
- org.openrewrite.java.migrate.datanucleus.DataNucleusProperties_5_1: Rename property keys that changed in DataNucleus 5.1.
- org.openrewrite.java.migrate.datanucleus.DataNucleusProperties_5_2: Rename property keys that changed in DataNucleus 5.2.
- org.openrewrite.java.migrate.datanucleus.DataNucleusTypeChanges_4_0: Rename types that were changed in DataNucleus 4.0.
- org.openrewrite.java.migrate.datanucleus.DataNucleusTypeChanges_5_0: Rename types that were changed in DataNucleus 5.0.
- org.openrewrite.java.migrate.datanucleus.UpgradeDataNucleus_4_0: Migrate DataNucleus 3.x applications to 4.0. This recipe handles package relocations, type renames, property key changes, and dependency updates introduced in AccessPlatform 4.0.
- org.openrewrite.java.migrate.datanucleus.UpgradeDataNucleus_5_0: Migrate DataNucleus 4.x applications to 5.0. This recipe handles package relocations, type renames, property key changes, and dependency updates.
- org.openrewrite.java.migrate.datanucleus.UpgradeDataNucleus_5_1: Migrate DataNucleus applications to 5.1. This recipe first applies the 5.0 migration, then handles the transaction namespace reorganization and other property renames introduced in 5.1.
- org.openrewrite.java.migrate.datanucleus.UpgradeDataNucleus_5_2: Migrate DataNucleus applications to 5.2. This recipe first applies the 5.1 migration, then handles the column mapping package move and query-related property renames introduced in 5.2.
- org.openrewrite.java.migrate.lang.JavadocToMarkdownDocComment: Convert traditional Javadoc comments (
/** ... */) to Markdown documentation comments (///) as supported by JEP 467 in Java 23+. Transforms HTML constructs like<pre>,<code>,<em>,<p>, and lists to their Markdown equivalents, and converts inline tags like{@code}and{@link}to Markdown syntax. - org.openrewrite.java.migrate.lang.var.UseVarForConstructors: Replace explicit type declarations with
varwhen the variable is initialized with a constructor call of exactly the same type. Does not transform when declared type differs from constructor type (e.g., interface vs implementation). - org.openrewrite.java.recipes.RemoveNlsRewriteAnnotations: Remove
@NlsRewrite.DisplayNameand@NlsRewrite.Descriptionannotations, but only from classes that extendRecipe. - org.openrewrite.java.recipes.UseVisitWithParentCursor: When calling another visitor from within a visitor, use the generic
visit(tree, ctx, getCursor().getParentTreeCursor())method instead of a specificvisit*method likevisitMethodInvocation. The specific visit methods bypass the visitor lifecycle, including cursor setup, pre/post visit hooks, and observer notifications. - org.openrewrite.java.spring.boot2.ConditionalOnBeanAnyNestedConditionBoot1: Migrate multi-condition
@ConditionalOnBeanannotations to useAnyNestedConditionwhen upgrading from Spring Boot 1.x to 2.x. In Boot 1.x, listing multiple beans in@ConditionalOnBeanmeant OR (any match); in Boot 2.x+ it means AND (all must match). This recipe preserves the original OR semantics by wrapping conditions in anAnyNestedConditionclass. - org.openrewrite.java.spring.boot2.MigrateArtemisProperties: Combines
spring.artemis.hostandspring.artemis.portintospring.artemis.broker-urlin the formattcp://host:port. - org.openrewrite.java.spring.boot4.UnwrapMockAndSpyBeanContainers: Replaces class-level
@MockBeansand@SpyBeanscontainer annotations with a single class-level@MockBeanor@SpyBeanannotation with a mergedtypesattribute for compatibility with@MockitoBean. - org.openrewrite.java.spring.cloud2025.UpgradeSpringCloud_2025_1: Migrate applications to the latest Spring Cloud 2025.1 release, compatible with Spring Boot 4.0.
- org.openrewrite.java.spring.mvc.JaxrsToSpringMvcMediaType: Replaces all JAX-RS MediaType with Spring MVC MediaType.
- org.openrewrite.java.spring.mvc.JaxrsToSpringMvcResponseEntity: Replaces all JAX-RS Response with Spring MVC ResponseEntity.
- org.openrewrite.java.testing.mockito.AddMockitoJupiterDependency: Adds
org.mockito:mockito-junit-jupiterdependency if@ExtendWith(MockitoExtension.class)will be added to any test class, i.e. when Mockito annotations are used in JUnit 5 tests without the extension already present. - org.openrewrite.java.testing.mockito.ArgumentMatcherToLambda: Converts anonymous
ArgumentMatcher<T>implementations withmatches(Object)to lambda expressions with the correct parameter type. In Mockito 1.x,ArgumentMatcher<T>extended Hamcrest'sBaseMatcherandmatchesalways tookObject. In Mockito 2+,ArgumentMatcher<T>is a functional interface wherematchestakesT. - org.openrewrite.java.testing.mockito.PowerMockRunnerDelegateToRunWith: Replaces
@PowerMockRunnerDelegate(X.class)by promoting the delegate runner to@RunWith(X.class)and removing the PowerMock-specific annotation. - org.openrewrite.java.testing.mockito.ReplaceMockitoTestExecutionListenerForJUnit4: Replace
MockitoTestExecutionListenerin projects that have JUnit 4 as a dependency. Uses@RunWith(MockitoJUnitRunner.class)as the replacement. - org.openrewrite.java.testing.mockito.ReplaceMockitoTestExecutionListenerForJupiter: Replace
MockitoTestExecutionListenerin projects that have JUnit Jupiter as a dependency. Uses@ExtendWith(MockitoExtension.class)as the replacement. - org.openrewrite.java.testing.mockito.ReplaceMockitoTestExecutionListenerForTestNG: Replace
MockitoTestExecutionListenerin projects that have TestNG as a dependency. UsesMockitoAnnotations.openMocks(this)with@BeforeMethod/@AfterMethodas the replacement. - org.openrewrite.jcl.search.FindWord: Search for JCL words based on a search term.
- org.openrewrite.maven.cleanup.NoSystemScopeDependencies: Replaces
<scope>system</scope>with the default compile scope and removes<systemPath>for dependencies that are available in configured repositories. - org.openrewrite.properties.CopyValue: Copies a property value from one key to another. The existing key/value pair remains unaffected by this change. If the destination key already exists, its value will be replaced. By default, creates the destination key if it does not exist.
- org.openrewrite.staticanalysis.ExplicitThis: Add explicit 'this.' prefix to field and method access.
- org.openrewrite.staticanalysis.InterruptedExceptionHandling: When
InterruptedExceptionis caught,Thread.currentThread().interrupt()should be called to restore the thread's interrupted state. Failing to do so can suppress the interruption signal and prevent proper thread cancellation. - org.openrewrite.staticanalysis.MemberNameCaseInsensitiveDuplicates: Looking at the set of methods and fields in a class and all of its parents, no two members should have names that differ only in capitalization. This rule will not report if a method overrides a parent method.
- org.openrewrite.staticanalysis.UseTryWithResources: Refactor try/finally blocks to use try-with-resources when the finally block only closes an
AutoCloseableresource.
Removed Recipes
- org.openrewrite.staticanalysis.RemoveTrailingWhitespace: Remove trailing whitespace from the end of each line. Trailing whitespace is simply useless and should not stay in code. It may generate noise when comparing different versions of the same file.
Changed Recipes
- org.openrewrite.github.AddDependabotCooldown was changed:
- Old Options:
cooldownDays: { type: Integer, required: false }exclude: { type: List, required: false }include: { type: List, required: false }semverMajorDays: { type: Integer, required: false }semverMinorDays: { type: Integer, required: false }semverPatchDays: { type: Integer, required: false }
- New Options:
cooldownDays: { type: Integer, required: false }exclude: { type: List, required: false }excludeEcosystems: { type: List, required: false }include: { type: List, required: false }semverMajorDays: { type: Integer, required: false }semverMinorDays: { type: Integer, required: false }semverPatchDays: { type: Integer, required: false }
- Old Options:
- org.openrewrite.java.testing.mockito.ReplaceMockitoTestExecutionListener was changed:
- Old Options:
None
- New Options:
targetFramework: { type: String, required: false }
- Old Options: