8.85.0 release (2026-06-17)
Total recipe count: 4463
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
v4.3.2
New Recipes
- ai.timefold.solver.migration.fork.TimefoldChangeDependencies: Migrate all Maven and Gradle groupIds and artifactIds from OptaPlanner to Timefold.
- ai.timefold.solver.migration.v8.AsConstraintRecipe: Use
penalize().asConstraint()andreward().asConstraint()instead of the deprecatedpenalize()andreward()methods. - ai.timefold.solver.migration.v8.ConstraintRefRecipe: Use
getConstraintRef()instead ofgetConstraintId()et al. - ai.timefold.solver.migration.v8.EnvironmentMigrationRecipe: Use non-deprecated environment constants.
- ai.timefold.solver.migration.v8.NullableRecipe: Removes references to null vars and replace them with unassigned values.
- ai.timefold.solver.migration.v8.RemoveConstraintPackageRecipe: Remove the use of constraint package from
asConstraint(package, name). - ai.timefold.solver.migration.v8.ScoreGettersRecipe: Use
score()instead ofgetScore()onScoreimplementations. - ai.timefold.solver.migration.v8.ScoreManagerMethodsRecipe: Use
explain()andupdate()instead ofexplainScore(),updateScore()andgetSummary(). - ai.timefold.solver.migration.v8.SingleConstraintAssertionMethodsRecipe: Use
penalizesBy/rewardsWith(String, int)instead ofpenalizesBy/rewardsWith(int, String)onSingleConstraintAssertiontests. - ai.timefold.solver.migration.v8.SolutionManagerRecommendAssignmentRecipe: Use recommendAssignment() instead of recommendFit().
- ai.timefold.solver.migration.v8.SolverManagerBuilderRecipe: Use
solveBuilder()instead of deprecated solve methods onSolveManager. - ai.timefold.solver.migration.v8.SortingMigrationRecipe: Use non-deprecated related sorting fields and methods.
- io.axoniq.framework.migration.Axon4ToAxoniq5AxonServerConnector: Relocates the Axon Server connector from
org.axonframework.axonserver.connectortoio.axoniq.framework.axonserver.connector. The connector now lives in the Axoniq commercial offering (io.axoniq.framework:axon-server-connector). Class names are mostly preserved. - io.axoniq.framework.migration.Axon4ToAxoniq5Bom: Replaces the imported
org.axonframework:axon-bom(AF4) ororg.axonframework:axon-framework-bom(free AF5) in<dependencyManagement>with the Axoniq Framework 5 commercial BOMio.axoniq.framework:axoniq-framework-bom. - io.axoniq.framework.migration.Axon4ToAxoniq5DeadLetter: Relocates the Sequenced Dead-Letter Queue (DLQ) types from the open-source
axon-messagingmodule to the Axoniq commercialaxoniq-dead-lettermodule (io.axoniq.framework:axoniq-dead-letter). Class names — includingSequencedDeadLetterQueue,JpaSequencedDeadLetterQueue,JdbcSequencedDeadLetterQueue,DeadLetteredEventProcessingTask,EnqueuePolicy,Decisions,ThrowableCause— are preserved. - io.axoniq.framework.migration.Axon4ToAxoniq5DistributedMessaging: Relocates the distributed command-bus components (DistributedCommandBus, CommandBusConnector) from the AF4 open-source
axon-messagingmodule into the Axoniq commercialaxoniq-distributed-messagingmodule (io.axoniq.framework.messaging.commandhandling.distributed). Each AF4 fully-qualified name is mapped directly to its final Axoniq location, so this recipe is order-independent relative to the open-source messaging package rename. - io.axoniq.framework.migration.Axon4ToAxoniq5EventStreaming: Placeholder. The Axoniq event streaming module (
io.axoniq.framework:axoniq-event-streaming) consolidates multi-stream event consumption that lived inMultiStreamableMessageSource(available since Axon Framework 4.2) into a dedicated module in Axoniq Framework 5. AF4 applications usingMultiStreamableMessageSourceshould migrate toaxoniq-event-streamingonce they adopt Axoniq Framework 5; this recipe will gain class-level mappings as that migration becomes deterministic. - io.axoniq.framework.migration.Axon4ToAxoniq5SpringBoot: Swaps the Spring Boot starter dependency to the Axoniq commercial variant (
io.axoniq.framework:axoniq-spring-boot-starter). Accepts both the AF4 raw coordinate (org.axonframework:axon-spring-boot-starter) and the post-Axon4ToAxon5SpringBootExtensioncoordinate (org.axonframework.extensions.spring:axon-spring-boot-starter). Class-level mappings for the Axoniq autoconfig packageio.axoniq.framework.springboot.*are not yet implemented. - io.axoniq.framework.migration.Axon4ToAxoniq5Testcontainer: Relocates the Axon Server Testcontainer types from the AF4
axon-testpackageorg.axonframework.test.serverto the dedicated Axoniq commercial artifactio.axoniq.framework:axoniq-testcontainerunderio.axoniq.framework.testcontainer. The Enterprise (AxonServerEEContainer) and Standard (AxonServerSEContainer) edition variants both collapse into the unifiedAxonServerContainerin Axoniq 5. - io.axoniq.framework.migration.UpgradeAxon4ToAxoniq5: Migrates an Axon Framework 4.x application to Axoniq Framework 5 (commercial). Composes
UpgradeAxon4ToAxon5(the free leg) and then layers commercial-only migrations: BOM swap toio.axoniq.framework:axoniq-framework-bom, Spring Boot starter swap toio.axoniq.framework:axoniq-spring-boot-starter, source rewrites and Maven adds for Axon Server connector, sequenced dead-letter queue, and distributed messaging. - io.quarkus.updates.camel.camel420.CamelQuarkusMigrationRecipe: Migrates
camel 4.18Quarkus application tocamel 4.20. - io.quarkus.updates.core.quarkus324.MigrateFromDefaultUniqueDelegate:
- io.quarkus.updates.core.quarkus324.MigrateFromEmptyInterceptor: Replace
extends EmptyInterceptorwithimplements Interceptor, SerializableasEmptyInterceptorwas removed in Hibernate ORM 7. - io.quarkus.updates.core.quarkus324.MigrateFromHibernateOrmEmptyInterceptor:
- io.quarkus.updates.core.quarkus324.MigrateFromHibernateOrmQueryHints:
- io.quarkus.updates.core.quarkus324.MigrateFromHibernateValidatorNotBlank:
- io.quarkus.updates.core.quarkus324.MigrateFromIndexColumn:
- io.quarkus.updates.core.quarkus337.PanacheNextRelocations:
- org.axonframework.migration.AddAxonTestFixtureTearDown: Adds an
@AfterEach tearDown()method callingstop()on theAxonTestFixturefield, when the test class has such a field but no existing@AfterEachmethod (and no method namedtearDown). Pairs withMigrateAggregateTestFixtureSetupwhich produces the field; the tear-down step was previously left for manual migration. Java sources only. - org.axonframework.migration.AddCommandAnnotation: Scans @CommandHandler methods and annotates their command parameter types with @Command. Also migrates @RoutingKey on a field to @Command(routingKey = "fieldName") on the class, removing the @RoutingKey field annotation.
- org.axonframework.migration.AddEntityCreatorAnnotation: Annotates existing no-arg constructors with
@EntityCreatorfor any class annotated with@EventSourcedEntityor the Spring@EventSourcedstereotype. Required by AF5 — the framework uses this annotation to instantiate the entity before applying events. Idempotent: skips constructors that are already annotated. - org.axonframework.migration.AddEventAnnotation: Scans @EventSourcingHandler methods and annotates their event parameter types with @Event. Migrates @Revision("x") on the class to @Event(version = "x"), removing the now-obsolete @Revision annotation.
- org.axonframework.migration.AddEventTagAnnotation: Scans event-sourced entity classes for their @AggregateIdentifier field and the event types used in @EventSourcingHandler methods, then annotates the corresponding field in each event class with @EventTag(key =
<EntitySimpleName>). - org.axonframework.migration.AnnotateObsoleteSequencingPolicyProperty: Inserts a one-line
# TODO(axon4to5): ...comment above anyaxon.eventhandling.processors.<group>.sequencing-policyentry inapplication.properties/application.yml. AF5 moves the decision onto the handler class via@SequencingPolicy; deleting the property here would race the per-construct skill that drives the source-side annotation, so this recipe only annotates. Idempotent. - org.axonframework.migration.Axon4ToAxon5AmqpExtension: Placeholder for the AMQP extension migration. The AMQP extension lives at
org.axonframework.extensions.amqpin AF4 and does not yet have a finalized Axon Framework 5 equivalent. Update this recipe once the AF5 AMQP integration ships. - org.axonframework.migration.Axon4ToAxon5Bom: Renames the imported
org.axonframework:axon-bomBOM in<dependencyManagement>toorg.axonframework:axon-framework-bomand pins the imported version to the current Axon Framework 5 release. The BOM artifactId changed between Axon Framework 4 and Axon Framework 5; the groupId is unchanged. - org.axonframework.migration.Axon4ToAxon5CdiExtension: Placeholder for the CDI extension migration. The extension lives at
org.axonframework.extensions.cdiin AF4 and does not yet have a finalized Axon Framework 5 equivalent. Update this recipe once the AF5 CDI integration ships. - org.axonframework.migration.Axon4ToAxon5Common: Migrates
org.axonframework.configtoorg.axonframework.common.configuration, renamesConfigurerModuletoConfigurationEnhancer,ModuleConfigurationtoModule,LifecycleOperationstoLifecycleRegistry, relocatesEventProcessingConfigurerunder the messaging.eventhandling namespace, and swaps@ProcessingGroupfor the AF5@Namespaceannotation. - org.axonframework.migration.Axon4ToAxon5Conversion: Migrates the Serializer-based
org.axonframework.serializationnamespace to the new Converter-basedorg.axonframework.conversionnamespace. Note: this is a package rename; concrete renames such asJacksonSerializertoJacksonConverterare NOT applied here and must be handled separately. - org.axonframework.migration.Axon4ToAxon5EventSourcing: Relocates the
@EventSourcingHandlerannotation intoeventsourcing.annotation, relocatesSnapshotterinto the neweventsourcing.snapshot.apiAPI package, ensures theorg.axonframework:axon-eventsourcingdependency is present when the app uses event-sourcing types (the AF5 Spring Boot starter no longer pulls it transitively, so apps not using the BOM need it added explicitly — it transitively bringsaxon-modellingandaxon-messaging), and applies the source-level aggregate→entity rewrites — annotating no-arg constructors with the now-mandatory@EntityCreatorand replacingAggregateLifecycle.apply(...)with an injectedEventAppender#append(...). - org.axonframework.migration.Axon4ToAxon5JGroupsExtension: Placeholder for the JGroups extension migration. The JGroups extension at
org.axonframework.extensions.jgroupsprovided distributed command bus routing in AF4. In Axon Framework 5 the distributed command bus has moved into the AxonIQ commercial offering (io.axoniq.framework:axoniq-distributed-messaging). Code usingJGroupsConnectormust be replaced with the AxonIQ commercial distributed messaging APIs. - org.axonframework.migration.Axon4ToAxon5KafkaExtension: Placeholder for the Kafka extension migration. The Kafka extension lives at
org.axonframework.extensions.kafkain AF4 and does not yet have a finalized Axon Framework 5 equivalent. Update this recipe once the AF5 Kafka integration ships. - org.axonframework.migration.Axon4ToAxon5Messaging: Migrates the messaging core (command, event, query handling) from
org.axonframework.{command,event,query}handlinginto theorg.axonframework.messaging.*namespace, relocates handler & interceptor annotations into their.annotation.*subpackages, renamesEventBustoEventSink, fixesMetaDatacasing toMetadata, relocates the top-level messaging API (Message,Metadata,UnitOfWork,MessageHandlerInterceptor,MessageHandlerInterceptorChain,correlation.*) intomessaging.core.*, moves the sequencing policy package out ofeventhandling.asyncintomessaging.core.sequencing, relocatestokenstoreand the replay/reset annotations under their AF5 subpackages, and movesQueryGatewayinto its own gateway subpackage. - org.axonframework.migration.Axon4ToAxon5MetricsDropwizardExtension: Relocates
org.axonframework.metricstoorg.axonframework.extension.metrics.dropwizard, reflecting the move from a flatmetricsnamespace to a per-provider layout underextension.metrics.*. - org.axonframework.migration.Axon4ToAxon5MetricsMicrometerExtension: Relocates
org.axonframework.micrometertoorg.axonframework.extension.metrics.micrometer, reflecting the move into the per-providerextension.metrics.*layout. - org.axonframework.migration.Axon4ToAxon5Modelling: Migrates the modelling layer from the
aggregatevocabulary to theentityvocabulary: relocatesorg.axonframework.modelling.commandtoorg.axonframework.modelling.entity, renamesTargetAggregateIdentifiertoTargetEntityId,AggregateMembertoEntityMember,Repositoryintomodelling.repository, andCommandTargetResolvertoEntityIdResolver. Strips AF4-only modelling annotations (@AggregateIdentifier,@CreationPolicy) that have no AF5 successor — id resolution moved onto commands via@TargetEntityId, and the AF4 creation-policy semantics map onto static command handlers in AF5 (a manual rewrite the recipe cannot infer beyond removing the annotation itself). - org.axonframework.migration.Axon4ToAxon5MongoExtension: Placeholder for the Mongo extension migration. The Mongo extension lives at
org.axonframework.extensions.mongoin AF4 and does not yet have a finalized Axon Framework 5 equivalent. Update this recipe once the AF5 Mongo integration ships. - org.axonframework.migration.Axon4ToAxon5MultitenancyExtension: Placeholder for the Multitenancy extension migration. The extension lives at
org.axonframework.extensions.multitenancyin AF4 and does not yet have a finalized Axon Framework 5 equivalent. Update this recipe once the AF5 multitenancy story ships. - org.axonframework.migration.Axon4ToAxon5QueryResponseTypes: On two-argument
queryGateway.query(payload, ResponseType)calls, unwraps the AF4ResponseTypes.instanceOf(...)/optionalInstanceOf(...)/multipleInstancesOf(...)wrapper to the plainClass<R>form AF5 expects, and renamesquery(payload, multipleInstancesOf(R.class))toqueryMany(payload, R.class). Three-argumentquery(String, Object, ...)forms,subscriptionQuery(...), andstreamingQuery(...)are left untouched so the per-construct migration skill keeps the AF4 fingerprints it needs for design decisions. RemovesResponseType/ResponseTypesimports only when no references remain. - org.axonframework.migration.Axon4ToAxon5ReactorExtension: Relocates
org.axonframework.extensions.reactor.*toorg.axonframework.extension.reactor.*(singularextension) and inserts themessaging.segment in front of thecommandhandling,eventhandling, andqueryhandlingsubpackages. The bareextensions.reactor.messaging.*package (which holdsReactorMessageDispatchInterceptorand the interceptor chain) is moved underextension.reactor.messaging.core.*. - org.axonframework.migration.Axon4ToAxon5SpringAotExtension: The
org.axonframework.extensions.spring-aot:axon-spring-aotextension has no Axon Framework 5 port. Removes the dependency so the project compiles against AF5. Projects that need Spring AOT / native-image support against AF5 must reintroduce equivalent functionality manually — there is no drop-in replacement. - org.axonframework.migration.Axon4ToAxon5SpringBootActuatorExtension: Relocates
org.axonframework.actuatortoorg.axonframework.extension.springboot.actuator. The Actuator support is now nested under the Spring Boot extension namespace. - org.axonframework.migration.Axon4ToAxon5SpringBootExtension: Relocates
org.axonframework.springboottoorg.axonframework.extension.springboot, matching the Maven groupId move toorg.axonframework.extensions.spring. Covers both the autoconfigure and starter artifacts (apps depend on the starter, which transitively pulls autoconfigure). Also rewrites Spring Boot configuration property keys whose binding class moved or was renamed in AF5. - org.axonframework.migration.Axon4ToAxon5SpringCloudExtension: Placeholder for the Spring Cloud extension migration. The Spring Cloud extension at
org.axonframework.extensions.springcloudprovided distributed command bus routing in AF4. In Axon Framework 5 the distributed command bus has moved into the AxonIQ commercial offering (io.axoniq.framework:axoniq-distributed-messaging). Code usingSpringCloudCommandRoutermust be replaced with the AxonIQ commercial distributed messaging APIs. - org.axonframework.migration.Axon4ToAxon5SpringExtension: Relocates
org.axonframework.springtoorg.axonframework.extension.springand renames the Spring stereotype@Aggregateto@EventSourced. The stereotype rename is mapped from both the AF4 location and the post-package- move location, so the recipe is order-independent. - org.axonframework.migration.Axon4ToAxon5Test: Renames
AggregateTestFixtureandSagaTestFixtureto the unifiedAxonTestFixtureintroduced in Axon Framework 5, and rewrites AF4-style flat fixture call chains (fixture.given(...).when(...).expectEvents(...)) to the AF5 fluent given/when/then API (fixture.given().events(...).when().command(...).then().events(...)). Also generates an@AfterEach tearDown()callingfixture.stop()on test classes that declare anAxonTestFixturefield but have no existing@AfterEach. Targets theaxon-testMaven artifact. Hamcrest matcher conversions and Kotlin@AfterEachinsertion remain manual. - org.axonframework.migration.Axon4ToAxon5TracingOpenTelemetryExtension: Placeholder for the OpenTelemetry tracing extension migration. Revisioning of the distributed tracing extension for Axon Framework 5 is slated for a later release (see issue #3594). Update this recipe once the AF5 OpenTelemetry tracing integration ships.
- org.axonframework.migration.Axon4ToAxon5TracingOpenTracingExtension: Placeholder. The OpenTracing tracing extension at
org.axonframework.extensions.tracingis superseded by the OpenTelemetry tracing extension in Axon Framework 5 (seeAxon4ToAxon5TracingOpenTelemetryExtension). Code using OpenTracing must be migrated to OpenTelemetry manually. - org.axonframework.migration.ConfigureEventSourcedAnnotation: Adds explicit tagKey =
<EntitySimpleName>and idType =<ResolvedType>.classto @EventSourced annotations that have no tagKey set. The tagKey is derived from the class simple name (matching the AF5 default). The idType is deduced from the type of the field annotated with @AggregateIdentifier in AF4. When that field is absent (e.g. POJO aggregate without an explicit identifier field) the idType falls back to Object.class and is flagged with a TODO(axon4to5): comment. - org.axonframework.migration.ConvertCommandHandlerConstructorToCompanionObject: Rewrites Kotlin
@CommandHandler constructor(...)declarations intocompanion object { @JvmStatic @CommandHandler fun handle(...) }on the same class, matching the AF5 contract where@CommandHandlerno longer targets constructors. Parameter list and method body are preserved. - org.axonframework.migration.ConvertCommandHandlerConstructorToStaticMethod: Rewrites Axon Framework 4
@CommandHandlerconstructors intopublic static void handle(...)methods, matching the AF5 contract where@CommandHandlerno longer targets constructors. Parameter list and method body are preserved. - org.axonframework.migration.MigrateAggregateTestFixtureSetup: Rewrites
new AggregateTestFixture<X>(X.class)(the AF4 aggregate-fixture constructor) to AF5'sAxonTestFixture.with(EventSourcingConfigurer.create().registerEntity(EventSourcedEntityModule.autodetected(<IdType>.class, X.class))). The aggregate type X is read from the class-literal constructor argument; the id type is looked up via the cross-recipe map populated by AddEventTagAnnotation (while @AggregateIdentifier is still on the source). Only matches the AF4 AggregateTestFixture FQN — SagaTestFixture setups are left for manual migration. - org.axonframework.migration.MigrateAxonTestFixtureFluentApi: Rewrites the flat AF4
fixture.given(...).when(...).expectEvents(...)call shape to the AF5 fluentfixture.given().events(...).when().command(...).then().events(...)shape, including the leaf-method renames (expectNoEvents→noEvents,expectSuccessfulHandlerExecution→success,expectException+expectExceptionMessage→ singleexception(cls, msg), etc.). The fixture setup migration (constructor →AxonTestFixture.with(configurer),@AfterEach stop()) and Hamcrest matcher conversions stay manual. - org.axonframework.migration.MigrateCommandGatewayInEventHandler: Inside every
@EventHandlermethod in the class, rewrites calls of the formcommandGateway.send(...)/commandGateway.sendAndWait(...)(wherecommandGatewayis a class-levelCommandGatewayfield) tocommandDispatcher.send(...)on a method-levelCommandDispatcherparameter — adding the parameter when missing. Forvoidhandlers whose body is a single dispatch expression or a single try/catch with one dispatch per branch, the return type is widened toCompletableFuture<?>and the dispatch is converted toreturn ... .getResultMessage();. Once no other references to the gateway field remain, the field, its constructor parameter, and the matching assignment are removed. - org.axonframework.migration.MigrateKotlinDslBomImport: Swaps the
groupId:artifactIdprefix of a Spring Dependency ManagementmavenBom("g:a:${property("...")}")call in abuild.gradle.ktsscript, leaving the${property(...)}indirection in place. Optionally updates the literal value of the matchingextra["..."]declaration so the version follows the new BOM. Targets a gap ingradle.ChangeManagedDependencywhere the Kotlin string-template variant ofproperty(...)is not recognized. - org.axonframework.migration.MigrateMessageInterceptorSignatures: Rewrites the method signatures of
MessageHandlerInterceptorandMessageDispatchInterceptorimplementations to their AF5 shape:handle(UnitOfWork, InterceptorChain) -> ObjectbecomesinterceptOnHandle(M, ProcessingContext, MessageHandlerInterceptorChain<M>) -> MessageStream<?>(and similarly for the dispatch interceptor). The method body is left untouched — the droppedunitOfWork/interceptorChainreferences become compile errors, surfacing every call site that needs review. A class-level// TODO(axon4to5):comment points to the migration path doc. The message typeMis read from theimplementsclause; raw implementations fall back toMessage. Runs after the AF4 -> AF5 FQN renames. - org.axonframework.migration.MigrateSequencingPolicyLambda: Rewrites single-argument
SequencingPolicylambdas (e -> body) to the AF5 shape(e, ctx) -> Optional.ofNullable(body). The AF5SequencingPolicy.sequenceIdentifierFormethod takes both a message and aProcessingContext, and returnsOptional<Object>instead of a nullableObject. Adds thejava.util.Optionalimport. Leaves block-body lambdas, multi-parameter lambdas, and anonymous inner classes alone — those need manual rewriting since the AF4 method name (getSequenceIdentifierFor) and the AF5 method name (sequenceIdentifierFor) differ. - org.axonframework.migration.MigrateSnapshotTriggerDefinitionToAnnotation: Replaces AF4 Spring Boot @Bean methods returning SnapshotTriggerDefinition with the AF5 @Snapshotting annotation on the corresponding aggregate class. EventCountSnapshotTriggerDefinition maps to afterEvents; AggregateLoadTimeSnapshotTriggerDefinition maps to afterSourcingTime. Custom implementations leave a TODO comment for manual review.
- org.axonframework.migration.RemoveTypeArguments: Removes the generic type arguments (
<...>) from any usage of the configured fully-qualified type. Preserves the underlying type reference and its surrounding context (variables, parameters, return types, generic bounds, etc.). - org.axonframework.migration.ReplaceAggregateLifecycleApply: Replaces every
AggregateLifecycle.apply(X)(statically imported or via the class) witheventAppender.append(X), injecting anEventAppender eventAppenderparameter into the enclosing method when one is not already declared. Drops the staticapplyimport once no usages remain. - org.axonframework.migration.UpgradeAxon4ToAxon5: Migrates an Axon Framework 4.x application to free (Apache 2.0) Axon Framework 5. Bumps the Axon Framework dependency versions, applies per-module rename recipes (one per core framework module), and renames Maven coordinates within the
org.axonframework.*namespace. Does NOT touch features dropped from free AF5 (Axon Server, DLQ, DistributedCommandBus) — seeUpgradeAxon4ToAxoniq5for the commercial path. - org.axonframework.migration.UpgradeJava: Bumps the Java compiler target in pom.xml/build.gradle to the configured LTS (defaults to 21, the Axon Framework 5 minimum). No-op for modules already at or above the target — projects already on a higher Java release are left untouched.
- org.axonframework.migration.UpgradeKotlin: Bumps the
org.jetbrains.kotlin:*dependency versions and thekotlin-maven-pluginto the configured Kotlin line (defaults to "2.x", the latest Kotlin 2.x). No-op for modules already at or above the target — the underlying upgrade recipes never downgrade. Rejects targets below Kotlin 2.0. - org.openrewrite.gradle.gradle9.OneDependencyDeclarationPerStatement: The Gradle Groovy DSL accepts multiple coordinates in a single configuration call (e.g.
implementation 'a:b:1.0', 'c:d:2.0'), but the Kotlin DSL does not. Gradle's best practices recommend declaring a single dependency per statement; see the Gradle dependency best practices. This recipe splits multi-coordinate Groovy DSL configuration calls into one call per coordinate. Run this as a cleanup pass before other dependency-aware recipes (e.g.UpgradeDependencyVersion,ChangeDependency,RemoveDependency): those recipes use theGradleDependencytrait, which only inspects the first argument of a configuration call. Coordinates in later positions are invisible to them until this recipe reshapes the source into one declaration per statement. - org.openrewrite.gradle.gradle9.UseMatchingInsteadOfFindAll: Gradle 9.4 deprecates the Groovy
DomainObjectCollection.findAll(Closure)overload on containers such astasks,configurations, andsourceSets. It is replaced by the lazyDomainObjectCollection.matching(Closure), which returns a live collection that only filters elements as they are needed by the build. This recipe only swaps the method name, leaving the closure argument unchanged, rewritingfindAll { ... }tomatching { ... }when the receiver is a known Gradle container collection. - org.openrewrite.gradle.gradle9.UseProjectDependencyInsteadOfModuleCoordinates: Gradle 9.3 deprecates depending on the current project by its own
group:name:versionmodule coordinates. In Gradle 9.x such a declaration resolves to the project's local outgoing variants, but in Gradle 10 it will instead attempt resolution from a repository. This recipe replaces a dependency declaration whose coordinates match the current project with the equivalentproject("<path>")notation. Requires theGradleProjectmarker (available when parsed by the OpenRewrite Gradle plugin) to know the current project's coordinates and path. - org.openrewrite.hibernate.MigrateToHypersistenceUtilsHibernate70: This recipe will migrate any existing dependencies on
io.hypersistence:hypersistence-utils-hibernate-63toio.hypersistence:hypersistence-utils-hibernate-70. - org.openrewrite.hibernate.MigrateToHypersistenceUtilsHibernate71: This recipe will migrate any existing dependencies on
io.hypersistence:hypersistence-utils-hibernate-70toio.hypersistence:hypersistence-utils-hibernate-71. - org.openrewrite.java.jackson.MigrateFactorySettersToBuilder: In Jackson 3,
JsonFactoryis immutable andnew JsonFactory()is no longer the right entry point: the concrete factory lives attools.jackson.core.json.JsonFactoryand is constructed viaJsonFactory.builder()...build(). Configuration methods likeenable,disable,configure,setCharacterEscapes, 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.UpgradeJackson_2_3_ModernizeJacksonCoreFeatures: Jackson 2.10 moved most flag constants out of
JsonParser.FeatureandJsonGenerator.Featureinto the newJsonReadFeature/JsonWriteFeature(for JSON-specific flags) andStreamReadFeature/StreamWriteFeature(for format-agnostic flags). Jackson 3 keeps only the modern locations. This recipe rewrites every legacy constant to its Jackson 2-modern equivalent so the rest of the Jackson 2 → 3 pipeline (in particular the builder migrations) sees flags the modern API will accept. - org.openrewrite.java.jackson.UseJsonFactoryStaticBuilder: After the Jackson 2 → 3 migration, prefer the concrete static
JsonFactory.builder()entry overnew JsonFactoryBuilder()soJsonFactorychains read the same way as the format-aligned factories (YAMLFactory.builder(),CBORFactory.builder(), etc.). The reasonMigrateFactorySettersToBuilderemitsnew JsonFactoryBuilder()in the first place is a Jackson 2 quirk —JsonFactory.builder()returned the wildcardTSFBuilder<?, ?>there. In Jackson 3 the static returns a concretely-typedJsonFactoryBuilder, so the constructor form no longer earns its keep. - org.openrewrite.java.logging.slf4j.Log4j2IsEnabledToSlf4jRecipes: Replace calls to
Logger.isEnabled(Level)with the corresponding SLF4J method calls. - org.openrewrite.java.logging.slf4j.Log4j2IsEnabledToSlf4jRecipes$LoggerIsEnabledLevelDebugRecipe: Replace calls to
org.apache.logging.log4j.Logger.isEnabled(Level.DEBUG)withorg.slf4j.Logger.isDebugEnabled(). - org.openrewrite.java.logging.slf4j.Log4j2IsEnabledToSlf4jRecipes$LoggerIsEnabledLevelErrorRecipe: Replace calls to
org.apache.logging.log4j.Logger.isEnabled(Level.ERROR)(orLevel.FATAL) withorg.slf4j.Logger.isErrorEnabled(), since SLF4J has noFATALlevel. - org.openrewrite.java.logging.slf4j.Log4j2IsEnabledToSlf4jRecipes$LoggerIsEnabledLevelInfoRecipe: Replace calls to
org.apache.logging.log4j.Logger.isEnabled(Level.INFO)withorg.slf4j.Logger.isInfoEnabled(). - org.openrewrite.java.logging.slf4j.Log4j2IsEnabledToSlf4jRecipes$LoggerIsEnabledLevelTraceRecipe: Replace calls to
org.apache.logging.log4j.Logger.isEnabled(Level.TRACE)(orLevel.ALL) withorg.slf4j.Logger.isTraceEnabled(), since SLF4J has noALLlevel. - org.openrewrite.java.logging.slf4j.Log4j2IsEnabledToSlf4jRecipes$LoggerIsEnabledLevelWarnRecipe: Replace calls to
org.apache.logging.log4j.Logger.isEnabled(Level.WARN)withorg.slf4j.Logger.isWarnEnabled(). - org.openrewrite.java.migrate.AddMockitoJavaAgentToMavenSurefirePlugin: Adds required configuration to specifically enable the Mockito/Bytebuddy Java agent in the Maven Surefire plugin for Java 21 compatibility.
- org.openrewrite.java.migrate.UpgradeKotlinJvmTargetVersion: Align the Kotlin
jvmTargetwith the project's Java version so the Kotlin compiler emits bytecode at the same level asjavac. Coverskotlin-maven-plugin<jvmTarget>configuration and the GradlekotlinOptions { jvmTarget = ... }/compilerOptions { jvmTarget = ... }blocks (Groovy and Kotlin DSL). Will not downgrade if the existing Kotlin target is higher than the requested version. - org.openrewrite.java.spring.boot3.UseRfc6265CookieProcessor: Replace the legacy Tomcat
LegacyCookieProcessorwith the RFC 6265 compliantRfc6265CookieProcessor, both in Java references and in the<CookieProcessor className="…"/>attribute of Tomcat configuration files such ascontext.xmlandserver.xml.Rfc6265CookieProcessorhas been the default cookie processor since Tomcat 8.5;LegacyCookieProcessorexists only for backwards compatibility. RFC 6265 parsing is stricter than the legacy behavior, so review applications relying on legacy cookie handling before applying this recipe. - org.openrewrite.java.testing.assertj.MigrateAssertionsForClassAndInterfaceTypes: AssertJ deprecated
AssertionsForClassTypesandAssertionsForInterfaceTypesin favor of the unifiedAssertionsentry point. This recipe retargets their static methods toAssertions, usingassertThatObjectwhere a plainassertThatwould otherwise re-bind to a more specific overload and stop compiling (see https://github.com/openrewrite/rewrite-testing-frameworks/issues/664). - org.openrewrite.java.testing.assertj.MigrateAssertionsForClassTypes: The deprecated
AssertionsForClassTypes.assertThat(T)always returns anObjectAssert, while the unifiedAssertions.assertThatadditionally offers more specific overloads (e.g. forIterable,Map,Predicate). For arguments matching those overloads, renameassertThattoassertThatObjectso that migrating toAssertionskeeps returning anObjectAssertand the code keeps compiling. - org.openrewrite.java.testing.junit.RemoveJupiterMigrationSupport: Remove JUnit Jupiter migrationsupport.
- org.openrewrite.java.testing.mockito.PowerMockWhiteboxGetInternalStateToJavaReflection: Replace
Whitebox.getInternalState(Object, String)withjava.lang.reflect.Fieldaccess, casting to the declared result type where needed. The field lookup usesgetDeclaredFieldon the target object's class, which differs from PowerMock's class-hierarchy traversal for fields inherited from a superclass. - org.openrewrite.java.testing.mockito.PowerMockWhiteboxInvokeMethodToJavaReflection: Replace
Whitebox.invokeMethod(Object, String, ..)withjava.lang.reflect.Methodlookup andinvoke(). Parameter types are taken from the unambiguously resolved target method, falling back to each argument's compile-time class. - org.openrewrite.java.testing.mockito.PowerMockWhiteboxSetInternalStateToJavaReflection: Replace
Whitebox.setInternalState(Object, String, Object)andWhitebox.setInternalState(Object, String, Object, Class)withjava.lang.reflect.Fieldaccess. The 3-arg overload looks up the field on the target's class; the 4-arg where-overload uses the supplied Class to resolve fields declared on a superclass. - org.openrewrite.java.testing.testcontainers.Testcontainers2LocalStack: Testcontainers 2.x removed the nested
LocalStackContainer.Serviceenum and thegetEndpointOverride(...)method. ReplaceLocalStackContainer.Serviceconstants with the equivalent service name strings andgetEndpointOverride(service)withgetEndpoint(), so code continues to compile against Testcontainers 2.x. This runs while the type is stillorg.testcontainers.containers.localstack.LocalStackContainer, before it is renamed. - org.openrewrite.javascript.AddDependency: Add an npm dependency to
package.jsonand regenerate the lock file by running the package manager. If the dependency already exists in any scope, the recipe is a no-op. Not safe to use as a precondition: invokes the package manager and publishes per-project state shared with other dependency recipes. - org.openrewrite.javascript.ChangeDependency: Renames an npm dependency in
package.jsonand optionally updates its version constraint. After modifying the package.json, the lock file is regenerated by running the package manager. Not safe to use as a precondition: invokes the package manager and publishes per-project state shared with other dependency recipes. - org.openrewrite.javascript.RemoveDependency: Remove an npm dependency from
package.jsonand regenerate the lock file. If the dependency does not exist in any scope, the recipe is a no-op. - org.openrewrite.javascript.UpgradeDependencyVersion: Upgrades the version constraint of matching npm dependencies in
package.jsonand regenerates the lock file by running the package manager. Matching is by exact package name or glob pattern. v1 uses simple string inequality for the upgrade check (always overwrites). A future version will use semver to skip already-up-to-date constraints. Not safe to use as a precondition: invokes the package manager and publishes per-project state shared with other dependency recipes. - org.openrewrite.javascript.UpgradeTransitiveDependencyVersion: Pins or upgrades a transitive npm dependency by adding an override entry to
package.jsonand regenerating the lock file. For npm and Bun, adds to theoverridesfield; for Yarn, adds toresolutions; for pnpm, adds topnpm.overrides. The override is idempotent — if the entry already exists with the same version, no change is made. Not safe to use as a precondition: invokes the package manager and publishes per-project state shared with other dependency recipes. - org.openrewrite.jenkins.MoveJenkinsfileShebangAndReparse: Groovy's Antlr4 parser rejects a
#!shebang that is not on the first line of the file, causing theJenkinsfileto be ingested as aParseError. This recipe detects that exact failure mode, relocates the shebang to line 1, and re-parses the result with the Groovy parser so downstream recipes have a usable Groovy LST to work with. - org.openrewrite.openapi.swagger.MigrateApiIgnoreParameterToParameterHidden: Springfox's
@ApiIgnoreis commonly placed on framework-injected controller parameters (Principal,HttpServletRequest,Pageable, ...). A flatChangeTypetoio.swagger.v3.oas.annotations.Hiddenproduces code that does not compile, because@Hiddencannot target parameters. Convert parameter usages directly to@io.swagger.v3.oas.annotations.Parameter(hidden = true)and leave method/class-level@ApiIgnorefor the subsequentChangeTypestep. - org.openrewrite.quarkus.MigrateToQuarkus_v3_33_0: Quarkus update recipes to upgrade your application to 3.33.0.
- org.openrewrite.quarkus.MigrateToQuarkus_v3_37_0: Quarkus update recipes to upgrade your application to 3.37.0.
Removed Recipes
- org.axonframework.migration.UpgradeAxonFramework_4_Jakarta: Migration file to upgrade from an Axon Framework Javax-specific project to Jakarta.
- org.axonframework.migration.UpgradeAxonFramework_4_Javax: Migration file to upgrade an Axon Framework Javax-specific project and remain on Javax.
- org.openrewrite.java.migrate.AddSurefireFailsafeArgLineForMockito: Adds
--add-opensJVM arguments required by Mockito and ByteBuddy to the Maven Surefire and Failsafe pluginargLineconfiguration. Only applied when the project depends on Mockito. - org.openrewrite.javascript.dependencies.add-dependency: Adds a new dependency to
package.jsonand updates the lock file by running the package manager. - org.openrewrite.javascript.dependencies.remove-dependency: Removes a dependency from
package.jsonand updates the lock file by running the package manager. - org.openrewrite.javascript.dependencies.upgrade-dependency-version: Upgrades the version of a direct dependency in
package.jsonand updates the lock file by running the package manager. EitherpackageNameorpackagePatternmust be specified. - org.openrewrite.javascript.dependencies.upgrade-transitive-dependency-version: Upgrades the version of a transitive dependency by adding override/resolution entries to
package.jsonand updates the lock file by running the package manager.