diff --git a/rewrite-gradle/src/main/java/org/openrewrite/gradle/gradle9/UseMainClassPropertyForApplication.java b/rewrite-gradle/src/main/java/org/openrewrite/gradle/gradle9/UseMainClassPropertyForApplication.java
new file mode 100644
index 0000000000..d2ece59626
--- /dev/null
+++ b/rewrite-gradle/src/main/java/org/openrewrite/gradle/gradle9/UseMainClassPropertyForApplication.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2026 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.openrewrite.gradle.gradle9;
+
+import lombok.EqualsAndHashCode;
+import lombok.Value;
+import org.openrewrite.ExecutionContext;
+import org.openrewrite.Preconditions;
+import org.openrewrite.Recipe;
+import org.openrewrite.TreeVisitor;
+import org.openrewrite.gradle.IsBuildGradle;
+import org.openrewrite.java.JavaVisitor;
+import org.openrewrite.java.tree.Expression;
+import org.openrewrite.java.tree.J;
+
+@Value
+@EqualsAndHashCode(callSuper = false)
+public class UseMainClassPropertyForApplication extends Recipe {
+
+ private static final String IN_APPLICATION = "IN_APPLICATION";
+
+ String displayName = "Use `mainClass` instead of `mainClassName` in the `application` block";
+
+ String description = "The `mainClassName` property on the `application` extension was deprecated in Gradle 6.4 and removed in Gradle 9.0. " +
+ "Use the `mainClass` property instead. " +
+ "See the [Gradle upgrade guide](https://docs.gradle.org/9.0.0/userguide/upgrading_major_version_9.html) for more information.";
+
+ @Override
+ public TreeVisitor, ExecutionContext> getVisitor() {
+ return Preconditions.check(new IsBuildGradle<>(), new JavaVisitor() {
+ @Override
+ public J visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx) {
+ if ("application".equals(method.getSimpleName())) {
+ getCursor().putMessage(IN_APPLICATION, true);
+ }
+ return super.visitMethodInvocation(method, ctx);
+ }
+
+ @Override
+ public J.Assignment visitAssignment(J.Assignment assignment, ExecutionContext ctx) {
+ if (getCursor().getNearestMessage(IN_APPLICATION) == null) {
+ return assignment;
+ }
+ Expression variable = assignment.getVariable();
+ if (variable instanceof J.Identifier) {
+ J.Identifier id = (J.Identifier) variable;
+ if ("mainClassName".equals(id.getSimpleName())) {
+ return assignment.withVariable(id.withSimpleName("mainClass"));
+ }
+ } else if (variable instanceof J.FieldAccess) {
+ J.FieldAccess fieldAccess = (J.FieldAccess) variable;
+ if ("mainClassName".equals(fieldAccess.getSimpleName())) {
+ return assignment.withVariable(
+ fieldAccess.withName(fieldAccess.getName().withSimpleName("mainClass"))
+ );
+ }
+ }
+ return assignment;
+ }
+ });
+ }
+}
diff --git a/rewrite-gradle/src/main/resources/META-INF/rewrite/gradle-9.yml b/rewrite-gradle/src/main/resources/META-INF/rewrite/gradle-9.yml
index 8242ad1ced..bfee98c38b 100644
--- a/rewrite-gradle/src/main/resources/META-INF/rewrite/gradle-9.yml
+++ b/rewrite-gradle/src/main/resources/META-INF/rewrite/gradle-9.yml
@@ -25,4 +25,5 @@ recipeList:
addIfMissing: false
# Map notation has been deprecated in 9.1+
- org.openrewrite.gradle.DependencyUseStringNotation
- - org.openrewrite.gradle.gradle9.UseMainClassProperty
\ No newline at end of file
+ - org.openrewrite.gradle.gradle9.UseMainClassProperty
+ - org.openrewrite.gradle.gradle9.UseMainClassPropertyForApplication
\ No newline at end of file
diff --git a/rewrite-gradle/src/main/resources/META-INF/rewrite/recipes.csv b/rewrite-gradle/src/main/resources/META-INF/rewrite/recipes.csv
index be02db45aa..17e33567b8 100644
--- a/rewrite-gradle/src/main/resources/META-INF/rewrite/recipes.csv
+++ b/rewrite-gradle/src/main/resources/META-INF/rewrite/recipes.csv
@@ -1,31 +1,29 @@
ecosystem,packageName,name,displayName,description,recipeCount,category1,category2,options,dataTables
-maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.ChangeDependencyArtifactId,Change Gradle dependency artifact,Change the artifact of a specified Gradle dependency.,1,,Gradle,"[{""name"":""groupId"",""type"":""String"",""displayName"":""Group"",""description"":""The first part of a dependency coordinate `com.google.guava:guava:VERSION`. This can be a glob expression."",""example"":""com.fasterxml.jackson*"",""required"":true},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact"",""description"":""The second part of a dependency coordinate `com.google.guava:guava:VERSION`. This can be a glob expression."",""example"":""jackson-module*"",""required"":true},{""name"":""newArtifactId"",""type"":""String"",""displayName"":""New artifactId"",""description"":""The new artifactId to use."",""example"":""jackson-custom"",""required"":true},{""name"":""configuration"",""type"":""String"",""displayName"":""Dependency configuration"",""description"":""The dependency configuration to search for dependencies in."",""example"":""api""}]",
-maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.ChangeDependencyClassifier,Change a Gradle dependency classifier,Changes classifier of an existing dependency declared in `build.gradle` files.,1,,Gradle,"[{""name"":""groupId"",""type"":""String"",""displayName"":""Group"",""description"":""The first part of a dependency coordinate `com.google.guava:guava:VERSION`. This can be a glob expression."",""example"":""com.fasterxml.jackson*"",""required"":true},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact"",""description"":""The second part of a dependency coordinate `com.google.guava:guava:VERSION`. This can be a glob expression."",""example"":""jackson-module*"",""required"":true},{""name"":""newClassifier"",""type"":""String"",""displayName"":""New classifier"",""description"":""A qualification classifier for the dependency."",""example"":""sources""},{""name"":""configuration"",""type"":""String"",""displayName"":""Dependency configuration"",""description"":""The dependency configuration to search for dependencies in."",""example"":""api""}]",
-maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.ChangeDependencyConfiguration,Change a Gradle dependency configuration,A common example is the need to change `compile` to `api`/`implementation` as [part of the move](https://docs.gradle.org/current/userguide/upgrading_version_6.html) to Gradle 7.x and later.,1,,Gradle,"[{""name"":""groupId"",""type"":""String"",""displayName"":""Group"",""description"":""The first part of a dependency coordinate `com.google.guava:guava:VERSION`. This can be a glob expression."",""example"":""com.fasterxml.jackson*"",""required"":true},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact"",""description"":""The second part of a dependency coordinate `com.google.guava:guava:VERSION`. This can be a glob expression."",""example"":""jackson-module*"",""required"":true},{""name"":""newConfiguration"",""type"":""String"",""displayName"":""New configuration"",""description"":""A dependency configuration container."",""example"":""api"",""required"":true},{""name"":""configuration"",""type"":""String"",""displayName"":""Dependency configuration"",""description"":""The dependency configuration to search for dependencies in."",""example"":""api""}]",
+maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.UsePropertyAssignmentSyntax,Use `=` assignment syntax for Gradle properties,"Converts deprecated Groovy DSL property assignment syntax from space/method-call form (e.g., `description 'text'` or `description('text')`) to assignment form (`description = 'text'`). Addresses Gradle 8.14 deprecation: ""Properties should be assigned using the 'propName = value' syntax."".",1,,Gradle,"[{""name"":""propertyName"",""type"":""String"",""displayName"":""Property name"",""description"":""The name of the property whose method-call or space-separated syntax should be converted to assignment syntax using `=`."",""example"":""description"",""required"":true}]",
+maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.ChangeDependency,Change Gradle dependency,Change a Gradle dependency coordinates. The `newGroupId` or `newArtifactId` **MUST** be different from before.,1,,Gradle,"[{""name"":""oldGroupId"",""type"":""String"",""displayName"":""Old groupId"",""description"":""The old groupId to replace. The groupId is the first part of a dependency coordinate 'com.google.guava:guava:VERSION'. Supports glob expressions."",""example"":""org.openrewrite.recipe"",""required"":true},{""name"":""oldArtifactId"",""type"":""String"",""displayName"":""Old artifactId"",""description"":""The old artifactId to replace. The artifactId is the second part of a dependency coordinate 'com.google.guava:guava:VERSION'. Supports glob expressions."",""example"":""rewrite-testing-frameworks"",""required"":true},{""name"":""newGroupId"",""type"":""String"",""displayName"":""New groupId"",""description"":""The new groupId to use. Defaults to the existing group id."",""example"":""corp.internal.openrewrite.recipe""},{""name"":""newArtifactId"",""type"":""String"",""displayName"":""New artifactId"",""description"":""The new artifactId to use. Defaults to the existing artifact id."",""example"":""rewrite-testing-frameworks""},{""name"":""newVersion"",""type"":""String"",""displayName"":""New version"",""description"":""An exact version number or node-style semver selector used to select the version number. You can also use `latest.release` for the latest available version and `latest.patch` if the current version is a valid semantic version. For more details, you can look at the documentation page of [version selectors](https://docs.openrewrite.org/reference/dependency-version-selectors)."",""example"":""29.X""},{""name"":""versionPattern"",""type"":""String"",""displayName"":""Version pattern"",""description"":""Allows version selection to be extended beyond the original Node Semver semantics. So for example,Setting 'version' to \""25-29\"" can be paired with a metadata pattern of \""-jre\"" to select Guava 29.0-jre"",""example"":""-jre""},{""name"":""overrideManagedVersion"",""type"":""Boolean"",""displayName"":""Override managed version"",""description"":""If the old dependency has a managed version, this flag can be used to explicitly set the version on the new dependency. WARNING: No check is done on the NEW dependency to verify if it is managed, it relies on whether the OLD dependency had a managed version. The default for this flag is `false`.""},{""name"":""changeManagedDependency"",""type"":""Boolean"",""displayName"":""Update dependency management"",""description"":""Also update the dependency management section. The default for this flag is `true`.""}]","[{""name"":""org.openrewrite.maven.table.MavenMetadataFailures"",""displayName"":""Maven metadata failures"",""instanceName"":""Maven metadata failures"",""description"":""Attempts to resolve maven metadata that failed."",""columns"":[{""name"":""group"",""type"":""String"",""displayName"":""Group id"",""description"":""The groupId of the artifact for which the metadata download failed.""},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact id"",""description"":""The artifactId of the artifact for which the metadata download failed.""},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""The version of the artifact for which the metadata download failed.""},{""name"":""mavenRepositoryUri"",""type"":""String"",""displayName"":""Maven repository"",""description"":""The URL of the Maven repository that the metadata download failed on.""},{""name"":""snapshots"",""type"":""String"",""displayName"":""Snapshots"",""description"":""Does the repository support snapshots.""},{""name"":""releases"",""type"":""String"",""displayName"":""Releases"",""description"":""Does the repository support releases.""},{""name"":""failure"",""type"":""String"",""displayName"":""Failure"",""description"":""The reason the metadata download failed.""}]}]"
+maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.SortDependencies,Sort Gradle dependencies,"Sort dependencies in `build.gradle` and `build.gradle.kts` files. Dependencies are sorted alphabetically by configuration name (e.g. `api`, `implementation`), then by groupId, then by artifactId.",1,,Gradle,,
+maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.RemoveRedundantDependencyVersions,Remove redundant explicit dependencies and versions,"Remove explicitly-specified dependency versions that are managed by a Gradle `platform`, `enforcedPlatform` or the `io.spring.dependency-management` plugin. Also removes redundant direct dependencies and dependency constraints that are already satisfied by transitive dependencies.",1,,Gradle,"[{""name"":""groupPattern"",""type"":""String"",""displayName"":""Group"",""description"":""Group glob expression pattern used to match dependencies that should be managed.Group is the first part of a dependency coordinate `com.google.guava:guava:VERSION`."",""example"":""com.google.*""},{""name"":""artifactPattern"",""type"":""String"",""displayName"":""Artifact"",""description"":""Artifact glob expression pattern used to match dependencies that should be managed.Artifact is the second part of a dependency coordinate `com.google.guava:guava:VERSION`."",""example"":""guava*""},{""name"":""onlyIfManagedVersionIs"",""type"":""Comparator"",""displayName"":""Only if managed version is ..."",""description"":""Only remove the explicit version if the managed version has the specified comparative relationship to the explicit version. For example, `gte` will only remove the explicit version if the managed version is the same or newer. Default `eq`."",""valid"":[""ANY"",""EQ"",""LT"",""LTE"",""GT"",""GTE""]}]",
maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.ChangeDependencyExtension,Change a Gradle dependency extension,Changes extension of an existing dependency declared in `build.gradle` files.,1,,Gradle,"[{""name"":""groupId"",""type"":""String"",""displayName"":""Group"",""description"":""The first part of a dependency coordinate `com.google.guava:guava:VERSION`. This can be a glob expression."",""example"":""com.fasterxml.jackson*"",""required"":true},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact"",""description"":""The second part of a dependency coordinate `com.google.guava:guava:VERSION`. This can be a glob expression."",""example"":""jackson-module*"",""required"":true},{""name"":""newExtension"",""type"":""String"",""displayName"":""New extension"",""description"":""An artifact extension."",""example"":""jar"",""required"":true},{""name"":""configuration"",""type"":""String"",""displayName"":""Dependency configuration"",""description"":""The dependency configuration to search for dependencies in."",""example"":""api""}]",
-maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.ChangeDependencyGroupId,Change Gradle dependency group,Change the group of a specified Gradle dependency.,1,,Gradle,"[{""name"":""groupId"",""type"":""String"",""displayName"":""Group"",""description"":""The first part of a dependency coordinate `com.google.guava:guava:VERSION`. This can be a glob expression."",""example"":""com.fasterxml.jackson*"",""required"":true},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact"",""description"":""The second part of a dependency coordinate `com.google.guava:guava:VERSION`. This can be a glob expression."",""example"":""jackson-module*"",""required"":true},{""name"":""newGroupId"",""type"":""String"",""displayName"":""New groupId"",""description"":""The new groupId to use."",""example"":""corp.internal.jackson"",""required"":true},{""name"":""configuration"",""type"":""String"",""displayName"":""Dependency configuration"",""description"":""The dependency configuration to search for dependencies in."",""example"":""api""}]",
-maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.ChangeExtraProperty,Change Extra Property,Gradle's [ExtraPropertiesExtension](https://docs.gradle.org/current/dsl/org.gradle.api.plugins.ExtraPropertiesExtension.html) is a commonly used mechanism for setting arbitrary key/value pairs on a project. This recipe will change the value of a property with the given key name if that key can be found. It assumes that the value being set is a String literal. Does not add the value if it does not already exist.,1,,Gradle,"[{""name"":""key"",""type"":""String"",""displayName"":""Key"",""description"":""The key of the property to change."",""example"":""foo"",""required"":true},{""name"":""value"",""type"":""String"",""displayName"":""Value"",""description"":""The new value to set. The value will be treated the contents of a string literal."",""example"":""bar"",""required"":true}]",
-maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.ChangeManagedDependency,Change Gradle managed dependency,"Change a Gradle managed dependency coordinates. The `newGroupId` or `newArtifactId` **MUST** be different from before.
-For now, only Spring Dependency Management Plugin entries are supported and no other forms of managed dependencies (yet).",1,,Gradle,"[{""name"":""oldGroupId"",""type"":""String"",""displayName"":""Old groupId"",""description"":""The old groupId to replace. The groupId is the first part of a dependency coordinate 'com.google.guava:guava:VERSION'. Supports glob expressions."",""example"":""org.openrewrite.recipe"",""required"":true},{""name"":""oldArtifactId"",""type"":""String"",""displayName"":""Old artifactId"",""description"":""The old artifactId to replace. The artifactId is the second part of a dependency coordinate 'com.google.guava:guava:VERSION'. Supports glob expressions."",""example"":""rewrite-testing-frameworks"",""required"":true},{""name"":""newGroupId"",""type"":""String"",""displayName"":""New groupId"",""description"":""The new groupId to use. Defaults to the existing group id."",""example"":""corp.internal.openrewrite.recipe""},{""name"":""newArtifactId"",""type"":""String"",""displayName"":""New artifactId"",""description"":""The new artifactId to use. Defaults to the existing artifact id."",""example"":""rewrite-testing-frameworks""},{""name"":""newVersion"",""type"":""String"",""displayName"":""New version"",""description"":""An exact version number or node-style semver selector used to select the version number. You can also use `latest.release` for the latest available version and `latest.patch` if the current version is a valid semantic version. For more details, you can look at the documentation page of [version selectors](https://docs.openrewrite.org/reference/dependency-version-selectors)."",""example"":""29.X""},{""name"":""versionPattern"",""type"":""String"",""displayName"":""Version pattern"",""description"":""Allows version selection to be extended beyond the original Node Semver semantics. So for example,Setting 'version' to \""25-29\"" can be paired with a metadata pattern of \""-jre\"" to select Guava 29.0-jre"",""example"":""-jre""}]","[{""name"":""org.openrewrite.maven.table.MavenMetadataFailures"",""displayName"":""Maven metadata failures"",""instanceName"":""Maven metadata failures"",""description"":""Attempts to resolve maven metadata that failed."",""columns"":[{""name"":""group"",""type"":""String"",""displayName"":""Group id"",""description"":""The groupId of the artifact for which the metadata download failed.""},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact id"",""description"":""The artifactId of the artifact for which the metadata download failed.""},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""The version of the artifact for which the metadata download failed.""},{""name"":""mavenRepositoryUri"",""type"":""String"",""displayName"":""Maven repository"",""description"":""The URL of the Maven repository that the metadata download failed on.""},{""name"":""snapshots"",""type"":""String"",""displayName"":""Snapshots"",""description"":""Does the repository support snapshots.""},{""name"":""releases"",""type"":""String"",""displayName"":""Releases"",""description"":""Does the repository support releases.""},{""name"":""failure"",""type"":""String"",""displayName"":""Failure"",""description"":""The reason the metadata download failed.""}]}]"
-maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.ChangeTaskToTasksRegister,Change Gradle task eager creation to lazy registration,"Changes eager task creation `task exampleName(type: ExampleType)` to lazy registration `tasks.register(""exampleName"", ExampleType)`. Also supports Kotlin DSL: `task(""exampleName"")` to `tasks.register(""exampleName"")`.",1,,Gradle,,
maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.DependencyConstraintToRule,Dependency constraint to resolution rule,"Gradle [dependency constraints](https://docs.gradle.org/current/userguide/dependency_constraints.html#dependency-constraints) are useful for managing the versions of transitive dependencies. Some plugins, such as the Spring Dependency Management plugin, do not respect these constraints. This recipe converts constraints into [resolution rules](https://docs.gradle.org/current/userguide/resolution_rules.html), which can achieve similar effects to constraints but are harder for plugins to ignore.",1,,Gradle,,
maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.DependencyUseMapNotation,Use `Map` notation for Gradle dependency declarations,"In Gradle, dependencies can be expressed as a `String` like `""groupId:artifactId:version""`, or equivalently as a `Map` like `group: 'groupId', name: 'artifactId', version: 'version'` (groovy) or `group = ""groupId"", name = ""artifactId"", version = ""version""` (kotlin). This recipe replaces dependencies represented as `Strings` with an equivalent dependency represented as a `Map`.",1,,Gradle,,
-maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.DependencyUseStringNotation,Use `String` notation for Gradle dependency declarations,"In Gradle, dependencies can be expressed as a `String` like `""groupId:artifactId:version""`, or equivalently as a `Map` like `group: 'groupId', name: 'artifactId', version: 'version'`, or as positional parameters like `(""groupId"", ""artifactId"", ""version"")`. This recipe replaces dependencies represented as `Maps` or positional parameters with an equivalent dependency represented as a `String`, as recommended per the [Gradle best practices for dependencies to use a single GAV](https://docs.gradle.org/8.14.2/userguide/best_practices_dependencies.html#single-gav-string).",1,,Gradle,,
-maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.EnableDevelocityBuildCache,Enable Develocity build cache,Adds `buildCache` configuration to `develocity` where not yet present.,1,,Gradle,"[{""name"":""remoteEnabled"",""type"":""String"",""displayName"":""Enable remote build cache"",""description"":""Value for `//develocity/buildCache/remote/enabled`."",""example"":""true""},{""name"":""remotePushEnabled"",""type"":""String"",""displayName"":""Enable remote build cache push"",""description"":""Value for `//develocity/buildCache/remote/storeEnabled`."",""example"":""System.getenv(\""CI\"") != null""}]",
-maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.RemoveDependency,Remove a Gradle dependency,Removes a single dependency from the dependencies section of the `build.gradle`.,1,,Gradle,"[{""name"":""groupId"",""type"":""String"",""displayName"":""Group"",""description"":""The first part of a dependency coordinate `com.google.guava:guava:VERSION`. This can be a glob expression."",""example"":""com.fasterxml.jackson*"",""required"":true},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact"",""description"":""The second part of a dependency coordinate `com.google.guava:guava:VERSION`. This can be a glob expression."",""example"":""jackson-module*"",""required"":true},{""name"":""configuration"",""type"":""String"",""displayName"":""The dependency configuration"",""description"":""The dependency configuration to remove from."",""example"":""api""}]",
maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.RemoveEnableFeaturePreview,Remove an enabled Gradle preview feature,Remove an enabled Gradle preview feature from `settings.gradle`.,1,,Gradle,"[{""name"":""previewFeatureName"",""type"":""String"",""displayName"":""The feature preview name"",""description"":""The name of the feature preview to remove."",""example"":""ONE_LOCKFILE_PER_PROJECT"",""required"":true}]",
+maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.ChangeExtraProperty,Change Extra Property,Gradle's [ExtraPropertiesExtension](https://docs.gradle.org/current/dsl/org.gradle.api.plugins.ExtraPropertiesExtension.html) is a commonly used mechanism for setting arbitrary key/value pairs on a project. This recipe will change the value of a property with the given key name if that key can be found. It assumes that the value being set is a String literal. Does not add the value if it does not already exist.,1,,Gradle,"[{""name"":""key"",""type"":""String"",""displayName"":""Key"",""description"":""The key of the property to change."",""example"":""foo"",""required"":true},{""name"":""value"",""type"":""String"",""displayName"":""Value"",""description"":""The new value to set. The value will be treated the contents of a string literal."",""example"":""bar"",""required"":true}]",
+maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.ChangeDependencyArtifactId,Change Gradle dependency artifact,Change the artifact of a specified Gradle dependency.,1,,Gradle,"[{""name"":""groupId"",""type"":""String"",""displayName"":""Group"",""description"":""The first part of a dependency coordinate `com.google.guava:guava:VERSION`. This can be a glob expression."",""example"":""com.fasterxml.jackson*"",""required"":true},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact"",""description"":""The second part of a dependency coordinate `com.google.guava:guava:VERSION`. This can be a glob expression."",""example"":""jackson-module*"",""required"":true},{""name"":""newArtifactId"",""type"":""String"",""displayName"":""New artifactId"",""description"":""The new artifactId to use."",""example"":""jackson-custom"",""required"":true},{""name"":""configuration"",""type"":""String"",""displayName"":""Dependency configuration"",""description"":""The dependency configuration to search for dependencies in."",""example"":""api""}]",
+maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.UpdateGradleWrapper,Update Gradle wrapper,"Update the version of Gradle used in an existing Gradle wrapper. Queries `downloads.gradle.org` to determine the available releases, but prefers the artifact repository URL which already exists within the wrapper properties file. If your artifact repository does not contain the same Gradle distributions as `downloads.gradle.org`, then the recipe may suggest a version which is not available in your artifact repository.",1,,Gradle,"[{""name"":""version"",""type"":""String"",""displayName"":""New version"",""description"":""An exact version number or node-style semver selector used to select the version number. Defaults to the latest release available from `downloads.gradle.org` if not specified."",""example"":""7.x""},{""name"":""distribution"",""type"":""String"",""displayName"":""Distribution type"",""description"":""The distribution of Gradle to use. \""bin\"" includes Gradle binaries. \""all\"" includes Gradle binaries, source code, and documentation. Defaults to the distribution type of the existing wrapper properties file, or \""bin\"" if no wrapper properties file exists."",""valid"":[""bin"",""all""]},{""name"":""addIfMissing"",""type"":""Boolean"",""displayName"":""Add if missing"",""description"":""Add a Gradle wrapper, if it's missing. Defaults to `true`.""},{""name"":""wrapperUri"",""type"":""String"",""displayName"":""Wrapper URI"",""description"":""The URI of the Gradle wrapper distribution.\nSpecifies a custom location from which to download the Gradle wrapper scripts (gradlew, gradlew.bat, etc.). This is useful for setting up the Gradle wrapper without relying on Gradle's official distribution services.\n\nWhen this option is set, the version and distribution fields must not be specified — only one source of truth is allowed. The URI should point to a valid and reachable Gradle wrapper distribution (typically a .zip archive containing the wrapper files).\nThis is particularly helpful in environments where access to Gradle's central services is restricted or where custom Gradle wrapper setups are required.\nIf the URI is inaccessible, the recipe will leave the existing wrapper files in the repository unchanged, as they are generally compatible with various Gradle versions."",""example"":""https://downloads.gradle.org/distributions/gradle-8.5-bin.zip""},{""name"":""distributionChecksum"",""type"":""String"",""displayName"":""SHA-256 checksum"",""description"":""The SHA-256 checksum of the Gradle distribution. If specified, the recipe will add the checksum along with the custom distribution URL."",""example"":""29e49b10984e585d8118b7d0bc452f944e386458df27371b49b4ac1dec4b7fda""}]",
+maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.UpgradeTransitiveDependencyVersion,Upgrade transitive Gradle dependencies,"Upgrades the version of a transitive dependency in a Gradle build file. There are many ways to do this in Gradle, so the mechanism for upgrading a transitive dependency must be considered carefully depending on your style of dependency management.",1,,Gradle,"[{""name"":""groupId"",""type"":""String"",""displayName"":""Group"",""description"":""The first part of a dependency coordinate `com.google.guava:guava:VERSION`. This can be a glob expression."",""example"":""com.fasterxml.jackson*"",""required"":true},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact"",""description"":""The second part of a dependency coordinate `com.google.guava:guava:VERSION`. This can be a glob expression."",""example"":""jackson-module*"",""required"":true},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""An exact version number or node-style semver selector used to select the version number. You can also use `latest.release` for the latest available version and `latest.patch` if the current version is a valid semantic version. For more details, you can look at the documentation page of [version selectors](https://docs.openrewrite.org/reference/dependency-version-selectors). Defaults to `latest.release`."",""example"":""29.X""},{""name"":""versionPattern"",""type"":""String"",""displayName"":""Version pattern"",""description"":""Allows version selection to be extended beyond the original Node Semver semantics. So for example,Setting 'newVersion' to \""25-29\"" can be paired with a metadata pattern of \""-jre\"" to select Guava 29.0-jre"",""example"":""-jre""},{""name"":""because"",""type"":""String"",""displayName"":""Because"",""description"":""The reason for upgrading the transitive dependency. For example, we could be responding to a vulnerability."",""example"":""CVE-2021-1234""},{""name"":""onlyForConfigurations"",""type"":""List"",""displayName"":""Include configurations"",""description"":""A list of configurations to consider during the upgrade. For example, For example using `implementation, runtimeOnly`, we could be responding to a deployable asset vulnerability only (ignoring test scoped vulnerabilities)."",""example"":""implementation, runtimeOnly""}]","[{""name"":""org.openrewrite.maven.table.MavenMetadataFailures"",""displayName"":""Maven metadata failures"",""instanceName"":""Maven metadata failures"",""description"":""Attempts to resolve maven metadata that failed."",""columns"":[{""name"":""group"",""type"":""String"",""displayName"":""Group id"",""description"":""The groupId of the artifact for which the metadata download failed.""},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact id"",""description"":""The artifactId of the artifact for which the metadata download failed.""},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""The version of the artifact for which the metadata download failed.""},{""name"":""mavenRepositoryUri"",""type"":""String"",""displayName"":""Maven repository"",""description"":""The URL of the Maven repository that the metadata download failed on.""},{""name"":""snapshots"",""type"":""String"",""displayName"":""Snapshots"",""description"":""Does the repository support snapshots.""},{""name"":""releases"",""type"":""String"",""displayName"":""Releases"",""description"":""Does the repository support releases.""},{""name"":""failure"",""type"":""String"",""displayName"":""Failure"",""description"":""The reason the metadata download failed.""}]}]"
maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.RemoveExtension,Remove build extension by name,Remove a Gradle build extension from `settings.gradle(.kts)` or `build.gradle(.kts)` files.,1,,Gradle,"[{""name"":""methodName"",""type"":""String"",""displayName"":""Method name"",""description"":""The name of the build extension to remove, e.g., `buildCache`."",""example"":""buildCache"",""required"":true}]",
-maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.RemoveRedundantDependencyVersions,Remove redundant explicit dependencies and versions,"Remove explicitly-specified dependency versions that are managed by a Gradle `platform`, `enforcedPlatform` or the `io.spring.dependency-management` plugin. Also removes redundant direct dependencies and dependency constraints that are already satisfied by transitive dependencies.",1,,Gradle,"[{""name"":""groupPattern"",""type"":""String"",""displayName"":""Group"",""description"":""Group glob expression pattern used to match dependencies that should be managed.Group is the first part of a dependency coordinate `com.google.guava:guava:VERSION`."",""example"":""com.google.*""},{""name"":""artifactPattern"",""type"":""String"",""displayName"":""Artifact"",""description"":""Artifact glob expression pattern used to match dependencies that should be managed.Artifact is the second part of a dependency coordinate `com.google.guava:guava:VERSION`."",""example"":""guava*""},{""name"":""onlyIfManagedVersionIs"",""type"":""Comparator"",""displayName"":""Only if managed version is ..."",""description"":""Only remove the explicit version if the managed version has the specified comparative relationship to the explicit version. For example, `gte` will only remove the explicit version if the managed version is the same or newer. Default `eq`."",""valid"":[""ANY"",""EQ"",""LT"",""LTE"",""GT"",""GTE""]}]",
-maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.RemoveRedundantSecurityResolutionRules,Remove redundant security resolution rules,"Remove `resolutionStrategy.eachDependency` rules that pin dependencies to versions that are already being managed by a platform/BOM to equal or newer versions. Only removes rules that have a security advisory identifier (CVE or GHSA) in the `because` clause, unless a custom pattern is specified.",1,,Gradle,"[{""name"":""securityPattern"",""type"":""String"",""displayName"":""Security pattern"",""description"":""A regular expression pattern to identify security-related resolution rules by matching against the `because` clause. Rules matching this pattern will be considered for removal. The pattern is searched within the clause, so a `because` containing multiple identifiers (e.g., `CVE-2024-1234, GHSA-abcd-1234-efgh`) will match if any identifier matches. Default pattern matches CVE identifiers (e.g., `CVE-2024-1234`) and GitHub Security Advisory identifiers (e.g., `GHSA-xxxx-xxxx-xxxx`)."",""example"":""(CVE-\\d|GHSA-[a-z0-9])""}]",
-maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.RemoveRepository,Remove repository,"Removes a repository from Gradle build scripts. Named repositories include ""jcenter"", ""mavenCentral"", ""mavenLocal"", and ""google"".",1,,Gradle,"[{""name"":""repository"",""type"":""String"",""displayName"":""Repository"",""description"":""The name of the repository to remove"",""example"":""jcenter"",""required"":true}]",
-maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.SortDependencies,Sort Gradle dependencies,"Sort dependencies in `build.gradle` and `build.gradle.kts` files. Dependencies are sorted alphabetically by configuration name (e.g. `api`, `implementation`), then by groupId, then by artifactId.",1,,Gradle,,
-maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.SyncGradleExtPropertiesWithBom,Sync Gradle ext properties with BOM,"Downloads a BOM and compares its properties against Gradle ext properties. When the BOM defines a higher version for a property, the ext property is updated to match (or removed if `removeRedundantOverrides` is enabled).",1,,Gradle,"[{""name"":""groupId"",""type"":""String"",""displayName"":""Group ID"",""description"":""The groupId of the BOM to sync with."",""example"":""org.springframework.boot"",""required"":true},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact ID"",""description"":""The artifactId of the BOM to sync with."",""example"":""spring-boot-dependencies"",""required"":true},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""The version of the BOM to sync with."",""example"":""3.4.0"",""required"":true},{""name"":""removeRedundantOverrides"",""type"":""Boolean"",""displayName"":""Remove redundant overrides"",""description"":""When enabled, ext properties whose value is lower than or equal to the BOM version will be removed entirely instead of updated, since the BOM default is now sufficient.""}]",
-maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.UpdateJavaCompatibility,Update Gradle project Java compatibility,Find and updates the Java compatibility for the Gradle project.,1,,Gradle,"[{""name"":""version"",""type"":""Integer"",""displayName"":""Java version"",""description"":""The Java version to upgrade to."",""example"":""11"",""required"":true},{""name"":""compatibilityType"",""type"":""CompatibilityType"",""displayName"":""Compatibility type"",""description"":""The compatibility type to change"",""valid"":[""source"",""target""]},{""name"":""declarationStyle"",""type"":""DeclarationStyle"",""displayName"":""Declaration style"",""description"":""The desired style to write the new version as when being written to the `sourceCompatibility` or `targetCompatibility` variables. Default, match current source style. (ex. Enum: `JavaVersion.VERSION_11`, Number: 11, or String: \""11\"")"",""valid"":[""Enum"",""Number"",""String""]},{""name"":""allowDowngrade"",""type"":""Boolean"",""displayName"":""Allow downgrade"",""description"":""Allow downgrading the Java version.""},{""name"":""addIfMissing"",""type"":""Boolean"",""displayName"":""Add compatibility type if missing"",""description"":""Adds the specified compatibility type if one is not found.""}]",
-maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.UsePropertyAssignmentSyntax,Use `=` assignment syntax for Gradle properties,"Converts deprecated Groovy DSL property assignment syntax from space/method-call form (e.g., `description 'text'` or `description('text')`) to assignment form (`description = 'text'`). Addresses Gradle 8.14 deprecation: ""Properties should be assigned using the 'propName = value' syntax."".",1,,Gradle,"[{""name"":""propertyName"",""type"":""String"",""displayName"":""Property name"",""description"":""The name of the property whose method-call or space-separated syntax should be converted to assignment syntax using `=`."",""example"":""description"",""required"":true}]",
-maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.AddDependency,Add Gradle dependency,Add a gradle dependency to a `build.gradle` file in the correct configuration based on where it is used.,1,,Gradle,"[{""name"":""groupId"",""type"":""String"",""displayName"":""Group"",""description"":""The first part of a dependency coordinate 'com.google.guava:guava:VERSION'."",""example"":""com.google.guava"",""required"":true},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact"",""description"":""The second part of a dependency coordinate 'com.google.guava:guava:VERSION'"",""example"":""guava"",""required"":true},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""An exact version number or node-style semver selector used to select the version number. You can also use `latest.release` for the latest available version and `latest.patch` if the current version is a valid semantic version. For more details, you can look at the documentation page of [version selectors](https://docs.openrewrite.org/reference/dependency-version-selectors)."",""example"":""29.X""},{""name"":""versionPattern"",""type"":""String"",""displayName"":""Version pattern"",""description"":""Allows version selection to be extended beyond the original Node Semver semantics. So for example, Setting 'version' to \""25-29\"" can be paired with a metadata pattern of \""-jre\"" to select Guava 29.0-jre"",""example"":""-jre""},{""name"":""configuration"",""type"":""String"",""displayName"":""Configuration"",""description"":""A configuration to use when it is not what can be inferred from usage. Most of the time this will be left empty, but is used when adding a new as of yet unused dependency."",""example"":""implementation""},{""name"":""onlyIfUsing"",""type"":""String"",""displayName"":""Only if using"",""description"":""Used to determine if the dependency will be added and in which scope it should be placed."",""example"":""org.junit.jupiter.api.*""},{""name"":""classifier"",""type"":""String"",""displayName"":""Classifier"",""description"":""A classifier to add. Commonly used to select variants of a library."",""example"":""test""},{""name"":""extension"",""type"":""String"",""displayName"":""Extension"",""description"":""The extension of the dependency to add. If omitted Gradle defaults to assuming the type is \""jar\""."",""example"":""jar""},{""name"":""familyPattern"",""type"":""String"",""displayName"":""Family pattern"",""description"":""A pattern, applied to groupIds, used to determine which other dependencies should have aligned version numbers. Accepts '*' as a wildcard character."",""example"":""com.fasterxml.jackson*""},{""name"":""acceptTransitive"",""type"":""Boolean"",""displayName"":""Accept transitive"",""description"":""Default false. If enabled, the dependency will not be added if it is already on the classpath as a transitive dependency."",""example"":""true""}]","[{""name"":""org.openrewrite.maven.table.MavenMetadataFailures"",""displayName"":""Maven metadata failures"",""instanceName"":""Maven metadata failures"",""description"":""Attempts to resolve maven metadata that failed."",""columns"":[{""name"":""group"",""type"":""String"",""displayName"":""Group id"",""description"":""The groupId of the artifact for which the metadata download failed.""},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact id"",""description"":""The artifactId of the artifact for which the metadata download failed.""},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""The version of the artifact for which the metadata download failed.""},{""name"":""mavenRepositoryUri"",""type"":""String"",""displayName"":""Maven repository"",""description"":""The URL of the Maven repository that the metadata download failed on.""},{""name"":""snapshots"",""type"":""String"",""displayName"":""Snapshots"",""description"":""Does the repository support snapshots.""},{""name"":""releases"",""type"":""String"",""displayName"":""Releases"",""description"":""Does the repository support releases.""},{""name"":""failure"",""type"":""String"",""displayName"":""Failure"",""description"":""The reason the metadata download failed.""}]}]"
maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.AddPlatformDependency,Add Gradle platform dependency,Add a gradle platform dependency to a `build.gradle` file in the correct configuration based on where it is used.,1,,Gradle,"[{""name"":""groupId"",""type"":""String"",""displayName"":""Group"",""description"":""The first part of a dependency coordinate 'com.google.guava:guava:VERSION'."",""example"":""com.google.guava"",""required"":true},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact"",""description"":""The second part of a dependency coordinate 'com.google.guava:guava:VERSION'"",""example"":""guava"",""required"":true},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""An exact version number or node-style semver selector used to select the version number. You can also use `latest.release` for the latest available version and `latest.patch` if the current version is a valid semantic version. For more details, you can look at the documentation page of [version selectors](https://docs.openrewrite.org/reference/dependency-version-selectors)."",""example"":""29.X""},{""name"":""versionPattern"",""type"":""String"",""displayName"":""Version pattern"",""description"":""Allows version selection to be extended beyond the original Node Semver semantics. So for example, Setting 'version' to \""25-29\"" can be paired with a metadata pattern of \""-jre\"" to select Guava 29.0-jre"",""example"":""-jre""},{""name"":""configuration"",""type"":""String"",""displayName"":""Configuration"",""description"":""A configuration to use when it is not what can be inferred from usage. Most of the time this will be left empty, but is used when adding a new, as yet unused, dependency."",""example"":""implementation""},{""name"":""enforced"",""type"":""Boolean"",""displayName"":""Enforced"",""description"":""Used to determine whether the platform dependency should be enforcedPlatform."",""example"":""true""}]","[{""name"":""org.openrewrite.maven.table.MavenMetadataFailures"",""displayName"":""Maven metadata failures"",""instanceName"":""Maven metadata failures"",""description"":""Attempts to resolve maven metadata that failed."",""columns"":[{""name"":""group"",""type"":""String"",""displayName"":""Group id"",""description"":""The groupId of the artifact for which the metadata download failed.""},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact id"",""description"":""The artifactId of the artifact for which the metadata download failed.""},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""The version of the artifact for which the metadata download failed.""},{""name"":""mavenRepositoryUri"",""type"":""String"",""displayName"":""Maven repository"",""description"":""The URL of the Maven repository that the metadata download failed on.""},{""name"":""snapshots"",""type"":""String"",""displayName"":""Snapshots"",""description"":""Does the repository support snapshots.""},{""name"":""releases"",""type"":""String"",""displayName"":""Releases"",""description"":""Does the repository support releases.""},{""name"":""failure"",""type"":""String"",""displayName"":""Failure"",""description"":""The reason the metadata download failed.""}]}]"
+maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.UpgradeDependencyVersion,Upgrade Gradle dependency versions,"Upgrade the version of a dependency in a build.gradle file. Supports updating dependency declarations of various forms:
+ * `String` notation: `""group:artifact:version""`
+ * `Map` notation: `group: 'group', name: 'artifact', version: 'version'`
+Can update version numbers which are defined earlier in the same file in variable declarations.",1,,Gradle,"[{""name"":""groupId"",""type"":""String"",""displayName"":""Group"",""description"":""The first part of a dependency coordinate `com.google.guava:guava:VERSION`. This can be a glob expression."",""example"":""com.fasterxml.jackson*"",""required"":true},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact"",""description"":""The second part of a dependency coordinate `com.google.guava:guava:VERSION`. This can be a glob expression."",""example"":""jackson-module*"",""required"":true},{""name"":""newVersion"",""type"":""String"",""displayName"":""New version"",""description"":""An exact version number or node-style semver selector used to select the version number. You can also use `latest.release` for the latest available version and `latest.patch` if the current version is a valid semantic version. For more details, you can look at the documentation page of [version selectors](https://docs.openrewrite.org/reference/dependency-version-selectors). Defaults to `latest.release`."",""example"":""29.X""},{""name"":""versionPattern"",""type"":""String"",""displayName"":""Version pattern"",""description"":""Allows version selection to be extended beyond the original Node Semver semantics. So for example,Setting 'newVersion' to \""25-29\"" can be paired with a metadata pattern of \""-jre\"" to select Guava 29.0-jre"",""example"":""-jre""}]","[{""name"":""org.openrewrite.maven.table.MavenMetadataFailures"",""displayName"":""Maven metadata failures"",""instanceName"":""Maven metadata failures"",""description"":""Attempts to resolve maven metadata that failed."",""columns"":[{""name"":""group"",""type"":""String"",""displayName"":""Group id"",""description"":""The groupId of the artifact for which the metadata download failed.""},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact id"",""description"":""The artifactId of the artifact for which the metadata download failed.""},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""The version of the artifact for which the metadata download failed.""},{""name"":""mavenRepositoryUri"",""type"":""String"",""displayName"":""Maven repository"",""description"":""The URL of the Maven repository that the metadata download failed on.""},{""name"":""snapshots"",""type"":""String"",""displayName"":""Snapshots"",""description"":""Does the repository support snapshots.""},{""name"":""releases"",""type"":""String"",""displayName"":""Releases"",""description"":""Does the repository support releases.""},{""name"":""failure"",""type"":""String"",""displayName"":""Failure"",""description"":""The reason the metadata download failed.""}]}]"
+maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.AddDependency,Add Gradle dependency,Add a gradle dependency to a `build.gradle` file in the correct configuration based on where it is used.,1,,Gradle,"[{""name"":""groupId"",""type"":""String"",""displayName"":""Group"",""description"":""The first part of a dependency coordinate 'com.google.guava:guava:VERSION'."",""example"":""com.google.guava"",""required"":true},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact"",""description"":""The second part of a dependency coordinate 'com.google.guava:guava:VERSION'"",""example"":""guava"",""required"":true},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""An exact version number or node-style semver selector used to select the version number. You can also use `latest.release` for the latest available version and `latest.patch` if the current version is a valid semantic version. For more details, you can look at the documentation page of [version selectors](https://docs.openrewrite.org/reference/dependency-version-selectors)."",""example"":""29.X""},{""name"":""versionPattern"",""type"":""String"",""displayName"":""Version pattern"",""description"":""Allows version selection to be extended beyond the original Node Semver semantics. So for example, Setting 'version' to \""25-29\"" can be paired with a metadata pattern of \""-jre\"" to select Guava 29.0-jre"",""example"":""-jre""},{""name"":""configuration"",""type"":""String"",""displayName"":""Configuration"",""description"":""A configuration to use when it is not what can be inferred from usage. Most of the time this will be left empty, but is used when adding a new as of yet unused dependency."",""example"":""implementation""},{""name"":""onlyIfUsing"",""type"":""String"",""displayName"":""Only if using"",""description"":""Used to determine if the dependency will be added and in which scope it should be placed."",""example"":""org.junit.jupiter.api.*""},{""name"":""classifier"",""type"":""String"",""displayName"":""Classifier"",""description"":""A classifier to add. Commonly used to select variants of a library."",""example"":""test""},{""name"":""extension"",""type"":""String"",""displayName"":""Extension"",""description"":""The extension of the dependency to add. If omitted Gradle defaults to assuming the type is \""jar\""."",""example"":""jar""},{""name"":""familyPattern"",""type"":""String"",""displayName"":""Family pattern"",""description"":""A pattern, applied to groupIds, used to determine which other dependencies should have aligned version numbers. Accepts '*' as a wildcard character."",""example"":""com.fasterxml.jackson*""},{""name"":""acceptTransitive"",""type"":""Boolean"",""displayName"":""Accept transitive"",""description"":""Default false. If enabled, the dependency will not be added if it is already on the classpath as a transitive dependency."",""example"":""true""}]","[{""name"":""org.openrewrite.maven.table.MavenMetadataFailures"",""displayName"":""Maven metadata failures"",""instanceName"":""Maven metadata failures"",""description"":""Attempts to resolve maven metadata that failed."",""columns"":[{""name"":""group"",""type"":""String"",""displayName"":""Group id"",""description"":""The groupId of the artifact for which the metadata download failed.""},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact id"",""description"":""The artifactId of the artifact for which the metadata download failed.""},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""The version of the artifact for which the metadata download failed.""},{""name"":""mavenRepositoryUri"",""type"":""String"",""displayName"":""Maven repository"",""description"":""The URL of the Maven repository that the metadata download failed on.""},{""name"":""snapshots"",""type"":""String"",""displayName"":""Snapshots"",""description"":""Does the repository support snapshots.""},{""name"":""releases"",""type"":""String"",""displayName"":""Releases"",""description"":""Does the repository support releases.""},{""name"":""failure"",""type"":""String"",""displayName"":""Failure"",""description"":""The reason the metadata download failed.""}]}]"
+maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.ChangeDependencyClassifier,Change a Gradle dependency classifier,Changes classifier of an existing dependency declared in `build.gradle` files.,1,,Gradle,"[{""name"":""groupId"",""type"":""String"",""displayName"":""Group"",""description"":""The first part of a dependency coordinate `com.google.guava:guava:VERSION`. This can be a glob expression."",""example"":""com.fasterxml.jackson*"",""required"":true},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact"",""description"":""The second part of a dependency coordinate `com.google.guava:guava:VERSION`. This can be a glob expression."",""example"":""jackson-module*"",""required"":true},{""name"":""newClassifier"",""type"":""String"",""displayName"":""New classifier"",""description"":""A qualification classifier for the dependency."",""example"":""sources""},{""name"":""configuration"",""type"":""String"",""displayName"":""Dependency configuration"",""description"":""The dependency configuration to search for dependencies in."",""example"":""api""}]",
maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.AddProperty,Add Gradle property,Add a property to the `gradle.properties` file.,1,,Gradle,"[{""name"":""key"",""type"":""String"",""displayName"":""Property name"",""description"":""The name of the property to add."",""example"":""org.gradle.caching"",""required"":true},{""name"":""value"",""type"":""String"",""displayName"":""Property value"",""description"":""The value of the property to add."",""example"":""true"",""required"":true},{""name"":""overwrite"",""type"":""Boolean"",""displayName"":""Overwrite if exists"",""description"":""If a property with the same key exists, overwrite."",""example"":""true"",""required"":true},{""name"":""filePattern"",""type"":""String"",""displayName"":""File pattern"",""description"":""A glob expression that can be used to constrain which directories or source files should be searched. When not set, all source files are searched."",""example"":""**/*.properties""}]",
-maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.ChangeDependency,Change Gradle dependency,Change a Gradle dependency coordinates. The `newGroupId` or `newArtifactId` **MUST** be different from before.,1,,Gradle,"[{""name"":""oldGroupId"",""type"":""String"",""displayName"":""Old groupId"",""description"":""The old groupId to replace. The groupId is the first part of a dependency coordinate 'com.google.guava:guava:VERSION'. Supports glob expressions."",""example"":""org.openrewrite.recipe"",""required"":true},{""name"":""oldArtifactId"",""type"":""String"",""displayName"":""Old artifactId"",""description"":""The old artifactId to replace. The artifactId is the second part of a dependency coordinate 'com.google.guava:guava:VERSION'. Supports glob expressions."",""example"":""rewrite-testing-frameworks"",""required"":true},{""name"":""newGroupId"",""type"":""String"",""displayName"":""New groupId"",""description"":""The new groupId to use. Defaults to the existing group id."",""example"":""corp.internal.openrewrite.recipe""},{""name"":""newArtifactId"",""type"":""String"",""displayName"":""New artifactId"",""description"":""The new artifactId to use. Defaults to the existing artifact id."",""example"":""rewrite-testing-frameworks""},{""name"":""newVersion"",""type"":""String"",""displayName"":""New version"",""description"":""An exact version number or node-style semver selector used to select the version number. You can also use `latest.release` for the latest available version and `latest.patch` if the current version is a valid semantic version. For more details, you can look at the documentation page of [version selectors](https://docs.openrewrite.org/reference/dependency-version-selectors)."",""example"":""29.X""},{""name"":""versionPattern"",""type"":""String"",""displayName"":""Version pattern"",""description"":""Allows version selection to be extended beyond the original Node Semver semantics. So for example,Setting 'version' to \""25-29\"" can be paired with a metadata pattern of \""-jre\"" to select Guava 29.0-jre"",""example"":""-jre""},{""name"":""overrideManagedVersion"",""type"":""Boolean"",""displayName"":""Override managed version"",""description"":""If the old dependency has a managed version, this flag can be used to explicitly set the version on the new dependency. WARNING: No check is done on the NEW dependency to verify if it is managed, it relies on whether the OLD dependency had a managed version. The default for this flag is `false`.""},{""name"":""changeManagedDependency"",""type"":""Boolean"",""displayName"":""Update dependency management"",""description"":""Also update the dependency management section. The default for this flag is `true`.""}]","[{""name"":""org.openrewrite.maven.table.MavenMetadataFailures"",""displayName"":""Maven metadata failures"",""instanceName"":""Maven metadata failures"",""description"":""Attempts to resolve maven metadata that failed."",""columns"":[{""name"":""group"",""type"":""String"",""displayName"":""Group id"",""description"":""The groupId of the artifact for which the metadata download failed.""},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact id"",""description"":""The artifactId of the artifact for which the metadata download failed.""},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""The version of the artifact for which the metadata download failed.""},{""name"":""mavenRepositoryUri"",""type"":""String"",""displayName"":""Maven repository"",""description"":""The URL of the Maven repository that the metadata download failed on.""},{""name"":""snapshots"",""type"":""String"",""displayName"":""Snapshots"",""description"":""Does the repository support snapshots.""},{""name"":""releases"",""type"":""String"",""displayName"":""Releases"",""description"":""Does the repository support releases.""},{""name"":""failure"",""type"":""String"",""displayName"":""Failure"",""description"":""The reason the metadata download failed.""}]}]"
+maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.SyncGradleExtPropertiesWithBom,Sync Gradle ext properties with BOM,"Downloads a BOM and compares its properties against Gradle ext properties. When the BOM defines a higher version for a property, the ext property is updated to match (or removed if `removeRedundantOverrides` is enabled).",1,,Gradle,"[{""name"":""groupId"",""type"":""String"",""displayName"":""Group ID"",""description"":""The groupId of the BOM to sync with."",""example"":""org.springframework.boot"",""required"":true},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact ID"",""description"":""The artifactId of the BOM to sync with."",""example"":""spring-boot-dependencies"",""required"":true},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""The version of the BOM to sync with."",""example"":""3.4.0"",""required"":true},{""name"":""removeRedundantOverrides"",""type"":""Boolean"",""displayName"":""Remove redundant overrides"",""description"":""When enabled, ext properties whose value is lower than or equal to the BOM version will be removed entirely instead of updated, since the BOM default is now sufficient.""}]",
+maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.EnableDevelocityBuildCache,Enable Develocity build cache,Adds `buildCache` configuration to `develocity` where not yet present.,1,,Gradle,"[{""name"":""remoteEnabled"",""type"":""String"",""displayName"":""Enable remote build cache"",""description"":""Value for `//develocity/buildCache/remote/enabled`."",""example"":""true""},{""name"":""remotePushEnabled"",""type"":""String"",""displayName"":""Enable remote build cache push"",""description"":""Value for `//develocity/buildCache/remote/storeEnabled`."",""example"":""System.getenv(\""CI\"") != null""}]",
+maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.UpdateJavaCompatibility,Update Gradle project Java compatibility,Find and updates the Java compatibility for the Gradle project.,1,,Gradle,"[{""name"":""version"",""type"":""Integer"",""displayName"":""Java version"",""description"":""The Java version to upgrade to."",""example"":""11"",""required"":true},{""name"":""compatibilityType"",""type"":""CompatibilityType"",""displayName"":""Compatibility type"",""description"":""The compatibility type to change"",""valid"":[""source"",""target""]},{""name"":""declarationStyle"",""type"":""DeclarationStyle"",""displayName"":""Declaration style"",""description"":""The desired style to write the new version as when being written to the `sourceCompatibility` or `targetCompatibility` variables. Default, match current source style. (ex. Enum: `JavaVersion.VERSION_11`, Number: 11, or String: \""11\"")"",""valid"":[""Enum"",""Number"",""String""]},{""name"":""allowDowngrade"",""type"":""Boolean"",""displayName"":""Allow downgrade"",""description"":""Allow downgrading the Java version.""},{""name"":""addIfMissing"",""type"":""Boolean"",""displayName"":""Add compatibility type if missing"",""description"":""Adds the specified compatibility type if one is not found.""}]",
+maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.ChangeDependencyGroupId,Change Gradle dependency group,Change the group of a specified Gradle dependency.,1,,Gradle,"[{""name"":""groupId"",""type"":""String"",""displayName"":""Group"",""description"":""The first part of a dependency coordinate `com.google.guava:guava:VERSION`. This can be a glob expression."",""example"":""com.fasterxml.jackson*"",""required"":true},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact"",""description"":""The second part of a dependency coordinate `com.google.guava:guava:VERSION`. This can be a glob expression."",""example"":""jackson-module*"",""required"":true},{""name"":""newGroupId"",""type"":""String"",""displayName"":""New groupId"",""description"":""The new groupId to use."",""example"":""corp.internal.jackson"",""required"":true},{""name"":""configuration"",""type"":""String"",""displayName"":""Dependency configuration"",""description"":""The dependency configuration to search for dependencies in."",""example"":""api""}]",
maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.MigrateDependenciesToVersionCatalog,Migrate Gradle project dependencies to version catalog,"Migrates Gradle project dependencies to use the [version catalog](https://docs.gradle.org/current/userguide/platforms.html) feature. Supports migrating dependency declarations of various forms:
* `String` notation: `""group:artifact:version""`
* `Map` notation: `group: 'group', name: 'artifact', version: 'version'`
@@ -38,53 +36,56 @@ The recipe will:
* Preserve project dependencies unchanged
**Note:** If a version catalog already exists, the recipe will not modify it.",1,,Gradle,,
-maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.UpdateGradleWrapper,Update Gradle wrapper,"Update the version of Gradle used in an existing Gradle wrapper. Queries `downloads.gradle.org` to determine the available releases, but prefers the artifact repository URL which already exists within the wrapper properties file. If your artifact repository does not contain the same Gradle distributions as `downloads.gradle.org`, then the recipe may suggest a version which is not available in your artifact repository.",1,,Gradle,"[{""name"":""version"",""type"":""String"",""displayName"":""New version"",""description"":""An exact version number or node-style semver selector used to select the version number. Defaults to the latest release available from `downloads.gradle.org` if not specified."",""example"":""7.x""},{""name"":""distribution"",""type"":""String"",""displayName"":""Distribution type"",""description"":""The distribution of Gradle to use. \""bin\"" includes Gradle binaries. \""all\"" includes Gradle binaries, source code, and documentation. Defaults to the distribution type of the existing wrapper properties file, or \""bin\"" if no wrapper properties file exists."",""valid"":[""bin"",""all""]},{""name"":""addIfMissing"",""type"":""Boolean"",""displayName"":""Add if missing"",""description"":""Add a Gradle wrapper, if it's missing. Defaults to `true`.""},{""name"":""wrapperUri"",""type"":""String"",""displayName"":""Wrapper URI"",""description"":""The URI of the Gradle wrapper distribution.\nSpecifies a custom location from which to download the Gradle wrapper scripts (gradlew, gradlew.bat, etc.). This is useful for setting up the Gradle wrapper without relying on Gradle's official distribution services.\n\nWhen this option is set, the version and distribution fields must not be specified — only one source of truth is allowed. The URI should point to a valid and reachable Gradle wrapper distribution (typically a .zip archive containing the wrapper files).\nThis is particularly helpful in environments where access to Gradle's central services is restricted or where custom Gradle wrapper setups are required.\nIf the URI is inaccessible, the recipe will leave the existing wrapper files in the repository unchanged, as they are generally compatible with various Gradle versions."",""example"":""https://downloads.gradle.org/distributions/gradle-8.5-bin.zip""},{""name"":""distributionChecksum"",""type"":""String"",""displayName"":""SHA-256 checksum"",""description"":""The SHA-256 checksum of the Gradle distribution. If specified, the recipe will add the checksum along with the custom distribution URL."",""example"":""29e49b10984e585d8118b7d0bc452f944e386458df27371b49b4ac1dec4b7fda""}]",
-maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.UpgradeDependencyVersion,Upgrade Gradle dependency versions,"Upgrade the version of a dependency in a build.gradle file. Supports updating dependency declarations of various forms:
- * `String` notation: `""group:artifact:version""`
- * `Map` notation: `group: 'group', name: 'artifact', version: 'version'`
-Can update version numbers which are defined earlier in the same file in variable declarations.",1,,Gradle,"[{""name"":""groupId"",""type"":""String"",""displayName"":""Group"",""description"":""The first part of a dependency coordinate `com.google.guava:guava:VERSION`. This can be a glob expression."",""example"":""com.fasterxml.jackson*"",""required"":true},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact"",""description"":""The second part of a dependency coordinate `com.google.guava:guava:VERSION`. This can be a glob expression."",""example"":""jackson-module*"",""required"":true},{""name"":""newVersion"",""type"":""String"",""displayName"":""New version"",""description"":""An exact version number or node-style semver selector used to select the version number. You can also use `latest.release` for the latest available version and `latest.patch` if the current version is a valid semantic version. For more details, you can look at the documentation page of [version selectors](https://docs.openrewrite.org/reference/dependency-version-selectors). Defaults to `latest.release`."",""example"":""29.X""},{""name"":""versionPattern"",""type"":""String"",""displayName"":""Version pattern"",""description"":""Allows version selection to be extended beyond the original Node Semver semantics. So for example,Setting 'newVersion' to \""25-29\"" can be paired with a metadata pattern of \""-jre\"" to select Guava 29.0-jre"",""example"":""-jre""}]","[{""name"":""org.openrewrite.maven.table.MavenMetadataFailures"",""displayName"":""Maven metadata failures"",""instanceName"":""Maven metadata failures"",""description"":""Attempts to resolve maven metadata that failed."",""columns"":[{""name"":""group"",""type"":""String"",""displayName"":""Group id"",""description"":""The groupId of the artifact for which the metadata download failed.""},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact id"",""description"":""The artifactId of the artifact for which the metadata download failed.""},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""The version of the artifact for which the metadata download failed.""},{""name"":""mavenRepositoryUri"",""type"":""String"",""displayName"":""Maven repository"",""description"":""The URL of the Maven repository that the metadata download failed on.""},{""name"":""snapshots"",""type"":""String"",""displayName"":""Snapshots"",""description"":""Does the repository support snapshots.""},{""name"":""releases"",""type"":""String"",""displayName"":""Releases"",""description"":""Does the repository support releases.""},{""name"":""failure"",""type"":""String"",""displayName"":""Failure"",""description"":""The reason the metadata download failed.""}]}]"
-maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.UpgradeTransitiveDependencyVersion,Upgrade transitive Gradle dependencies,"Upgrades the version of a transitive dependency in a Gradle build file. There are many ways to do this in Gradle, so the mechanism for upgrading a transitive dependency must be considered carefully depending on your style of dependency management.",1,,Gradle,"[{""name"":""groupId"",""type"":""String"",""displayName"":""Group"",""description"":""The first part of a dependency coordinate `com.google.guava:guava:VERSION`. This can be a glob expression."",""example"":""com.fasterxml.jackson*"",""required"":true},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact"",""description"":""The second part of a dependency coordinate `com.google.guava:guava:VERSION`. This can be a glob expression."",""example"":""jackson-module*"",""required"":true},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""An exact version number or node-style semver selector used to select the version number. You can also use `latest.release` for the latest available version and `latest.patch` if the current version is a valid semantic version. For more details, you can look at the documentation page of [version selectors](https://docs.openrewrite.org/reference/dependency-version-selectors). Defaults to `latest.release`."",""example"":""29.X""},{""name"":""versionPattern"",""type"":""String"",""displayName"":""Version pattern"",""description"":""Allows version selection to be extended beyond the original Node Semver semantics. So for example,Setting 'newVersion' to \""25-29\"" can be paired with a metadata pattern of \""-jre\"" to select Guava 29.0-jre"",""example"":""-jre""},{""name"":""because"",""type"":""String"",""displayName"":""Because"",""description"":""The reason for upgrading the transitive dependency. For example, we could be responding to a vulnerability."",""example"":""CVE-2021-1234""},{""name"":""onlyForConfigurations"",""type"":""List"",""displayName"":""Include configurations"",""description"":""A list of configurations to consider during the upgrade. For example, For example using `implementation, runtimeOnly`, we could be responding to a deployable asset vulnerability only (ignoring test scoped vulnerabilities)."",""example"":""implementation, runtimeOnly""}]","[{""name"":""org.openrewrite.maven.table.MavenMetadataFailures"",""displayName"":""Maven metadata failures"",""instanceName"":""Maven metadata failures"",""description"":""Attempts to resolve maven metadata that failed."",""columns"":[{""name"":""group"",""type"":""String"",""displayName"":""Group id"",""description"":""The groupId of the artifact for which the metadata download failed.""},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact id"",""description"":""The artifactId of the artifact for which the metadata download failed.""},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""The version of the artifact for which the metadata download failed.""},{""name"":""mavenRepositoryUri"",""type"":""String"",""displayName"":""Maven repository"",""description"":""The URL of the Maven repository that the metadata download failed on.""},{""name"":""snapshots"",""type"":""String"",""displayName"":""Snapshots"",""description"":""Does the repository support snapshots.""},{""name"":""releases"",""type"":""String"",""displayName"":""Releases"",""description"":""Does the repository support releases.""},{""name"":""failure"",""type"":""String"",""displayName"":""Failure"",""description"":""The reason the metadata download failed.""}]}]"
+maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.RemoveDependency,Remove a Gradle dependency,Removes a single dependency from the dependencies section of the `build.gradle`.,1,,Gradle,"[{""name"":""groupId"",""type"":""String"",""displayName"":""Group"",""description"":""The first part of a dependency coordinate `com.google.guava:guava:VERSION`. This can be a glob expression."",""example"":""com.fasterxml.jackson*"",""required"":true},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact"",""description"":""The second part of a dependency coordinate `com.google.guava:guava:VERSION`. This can be a glob expression."",""example"":""jackson-module*"",""required"":true},{""name"":""configuration"",""type"":""String"",""displayName"":""The dependency configuration"",""description"":""The dependency configuration to remove from."",""example"":""api""}]",
+maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.RemoveRepository,Remove repository,"Removes a repository from Gradle build scripts. Named repositories include ""jcenter"", ""mavenCentral"", ""mavenLocal"", and ""google"".",1,,Gradle,"[{""name"":""repository"",""type"":""String"",""displayName"":""Repository"",""description"":""The name of the repository to remove"",""example"":""jcenter"",""required"":true}]",
+maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.ChangeManagedDependency,Change Gradle managed dependency,"Change a Gradle managed dependency coordinates. The `newGroupId` or `newArtifactId` **MUST** be different from before.
+For now, only Spring Dependency Management Plugin entries are supported and no other forms of managed dependencies (yet).",1,,Gradle,"[{""name"":""oldGroupId"",""type"":""String"",""displayName"":""Old groupId"",""description"":""The old groupId to replace. The groupId is the first part of a dependency coordinate 'com.google.guava:guava:VERSION'. Supports glob expressions."",""example"":""org.openrewrite.recipe"",""required"":true},{""name"":""oldArtifactId"",""type"":""String"",""displayName"":""Old artifactId"",""description"":""The old artifactId to replace. The artifactId is the second part of a dependency coordinate 'com.google.guava:guava:VERSION'. Supports glob expressions."",""example"":""rewrite-testing-frameworks"",""required"":true},{""name"":""newGroupId"",""type"":""String"",""displayName"":""New groupId"",""description"":""The new groupId to use. Defaults to the existing group id."",""example"":""corp.internal.openrewrite.recipe""},{""name"":""newArtifactId"",""type"":""String"",""displayName"":""New artifactId"",""description"":""The new artifactId to use. Defaults to the existing artifact id."",""example"":""rewrite-testing-frameworks""},{""name"":""newVersion"",""type"":""String"",""displayName"":""New version"",""description"":""An exact version number or node-style semver selector used to select the version number. You can also use `latest.release` for the latest available version and `latest.patch` if the current version is a valid semantic version. For more details, you can look at the documentation page of [version selectors](https://docs.openrewrite.org/reference/dependency-version-selectors)."",""example"":""29.X""},{""name"":""versionPattern"",""type"":""String"",""displayName"":""Version pattern"",""description"":""Allows version selection to be extended beyond the original Node Semver semantics. So for example,Setting 'version' to \""25-29\"" can be paired with a metadata pattern of \""-jre\"" to select Guava 29.0-jre"",""example"":""-jre""}]","[{""name"":""org.openrewrite.maven.table.MavenMetadataFailures"",""displayName"":""Maven metadata failures"",""instanceName"":""Maven metadata failures"",""description"":""Attempts to resolve maven metadata that failed."",""columns"":[{""name"":""group"",""type"":""String"",""displayName"":""Group id"",""description"":""The groupId of the artifact for which the metadata download failed.""},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact id"",""description"":""The artifactId of the artifact for which the metadata download failed.""},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""The version of the artifact for which the metadata download failed.""},{""name"":""mavenRepositoryUri"",""type"":""String"",""displayName"":""Maven repository"",""description"":""The URL of the Maven repository that the metadata download failed on.""},{""name"":""snapshots"",""type"":""String"",""displayName"":""Snapshots"",""description"":""Does the repository support snapshots.""},{""name"":""releases"",""type"":""String"",""displayName"":""Releases"",""description"":""Does the repository support releases.""},{""name"":""failure"",""type"":""String"",""displayName"":""Failure"",""description"":""The reason the metadata download failed.""}]}]"
+maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.ChangeTaskToTasksRegister,Change Gradle task eager creation to lazy registration,"Changes eager task creation `task exampleName(type: ExampleType)` to lazy registration `tasks.register(""exampleName"", ExampleType)`. Also supports Kotlin DSL: `task(""exampleName"")` to `tasks.register(""exampleName"")`.",1,,Gradle,,
+maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.ChangeDependencyConfiguration,Change a Gradle dependency configuration,A common example is the need to change `compile` to `api`/`implementation` as [part of the move](https://docs.gradle.org/current/userguide/upgrading_version_6.html) to Gradle 7.x and later.,1,,Gradle,"[{""name"":""groupId"",""type"":""String"",""displayName"":""Group"",""description"":""The first part of a dependency coordinate `com.google.guava:guava:VERSION`. This can be a glob expression."",""example"":""com.fasterxml.jackson*"",""required"":true},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact"",""description"":""The second part of a dependency coordinate `com.google.guava:guava:VERSION`. This can be a glob expression."",""example"":""jackson-module*"",""required"":true},{""name"":""newConfiguration"",""type"":""String"",""displayName"":""New configuration"",""description"":""A dependency configuration container."",""example"":""api"",""required"":true},{""name"":""configuration"",""type"":""String"",""displayName"":""Dependency configuration"",""description"":""The dependency configuration to search for dependencies in."",""example"":""api""}]",
+maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.RemoveRedundantSecurityResolutionRules,Remove redundant security resolution rules,"Remove `resolutionStrategy.eachDependency` rules that pin dependencies to versions that are already being managed by a platform/BOM to equal or newer versions. Only removes rules that have a security advisory identifier (CVE or GHSA) in the `because` clause, unless a custom pattern is specified.",1,,Gradle,"[{""name"":""securityPattern"",""type"":""String"",""displayName"":""Security pattern"",""description"":""A regular expression pattern to identify security-related resolution rules by matching against the `because` clause. Rules matching this pattern will be considered for removal. The pattern is searched within the clause, so a `because` containing multiple identifiers (e.g., `CVE-2024-1234, GHSA-abcd-1234-efgh`) will match if any identifier matches. Default pattern matches CVE identifiers (e.g., `CVE-2024-1234`) and GitHub Security Advisory identifiers (e.g., `GHSA-xxxx-xxxx-xxxx`)."",""example"":""(CVE-\\d|GHSA-[a-z0-9])""}]",
+maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.DependencyUseStringNotation,Use `String` notation for Gradle dependency declarations,"In Gradle, dependencies can be expressed as a `String` like `""groupId:artifactId:version""`, or equivalently as a `Map` like `group: 'groupId', name: 'artifactId', version: 'version'`, or as positional parameters like `(""groupId"", ""artifactId"", ""version"")`. This recipe replaces dependencies represented as `Maps` or positional parameters with an equivalent dependency represented as a `String`, as recommended per the [Gradle best practices for dependencies to use a single GAV](https://docs.gradle.org/8.14.2/userguide/best_practices_dependencies.html#single-gav-string).",1,,Gradle,,
maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.MigrateToGradle5,Migrate to Gradle 5 from Gradle 4,Migrate to version 5.x. See the Gradle upgrade guide from [version 4.x to 5.0](https://docs.gradle.org/current/userguide/upgrading_version_4.html) for more information.,2,,Gradle,,
maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.MigrateToGradle6,Migrate to Gradle 6 from Gradle 5,Migrate to version 6.x. See the Gradle upgrade guide from [version 5.x to 6.0](https://docs.gradle.org/current/userguide/upgrading_version_5.html) for more information.,10,,Gradle,,
maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.MigrateToGradle7,Migrate to Gradle 7 from Gradle 6,Migrate to version 7.x. See the Gradle upgrade guide from [version 6.x to 7.0](https://docs.gradle.org/current/userguide/upgrading_version_6.html) for more information.,13,,Gradle,,
maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.MigrateToGradle8,Migrate to Gradle 8 from Gradle 7,Migrate to version 8.x. See the Gradle upgrade guide from [version 7.x to 8.0](https://docs.gradle.org/current/userguide/upgrading_version_7.html) and [version 8.x to latest](https://docs.gradle.org/current/userguide/upgrading_version_8.html) for more information.,35,,Gradle,,"[{""name"":""org.openrewrite.maven.table.MavenMetadataFailures"",""displayName"":""Maven metadata failures"",""instanceName"":""Maven metadata failures"",""description"":""Attempts to resolve maven metadata that failed."",""columns"":[{""name"":""group"",""type"":""String"",""displayName"":""Group id"",""description"":""The groupId of the artifact for which the metadata download failed.""},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact id"",""description"":""The artifactId of the artifact for which the metadata download failed.""},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""The version of the artifact for which the metadata download failed.""},{""name"":""mavenRepositoryUri"",""type"":""String"",""displayName"":""Maven repository"",""description"":""The URL of the Maven repository that the metadata download failed on.""},{""name"":""snapshots"",""type"":""String"",""displayName"":""Snapshots"",""description"":""Does the repository support snapshots.""},{""name"":""releases"",""type"":""String"",""displayName"":""Releases"",""description"":""Does the repository support releases.""},{""name"":""failure"",""type"":""String"",""displayName"":""Failure"",""description"":""The reason the metadata download failed.""}]}]"
maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.UseAssignmentForPropertySyntax,Use `=` assignment syntax for well-known Gradle properties,"Converts deprecated Groovy DSL property assignment syntax from space/method-call form (e.g., `description 'text'` or `description('text')`) to assignment form (`description = 'text'`) for well-known Gradle project and task properties. See the [Gradle 8.14 upgrade guide](https://docs.gradle.org/8.14/userguide/upgrading_version_8.html#groovy_space_assignment_syntax) for more information.",14,,Gradle,,
maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.AddJUnitPlatformLauncher,Add JUnit Platform Launcher,Add the JUnit Platform Launcher to the buildscript dependencies.,2,,Gradle,,"[{""name"":""org.openrewrite.maven.table.MavenMetadataFailures"",""displayName"":""Maven metadata failures"",""instanceName"":""Maven metadata failures"",""description"":""Attempts to resolve maven metadata that failed."",""columns"":[{""name"":""group"",""type"":""String"",""displayName"":""Group id"",""description"":""The groupId of the artifact for which the metadata download failed.""},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact id"",""description"":""The artifactId of the artifact for which the metadata download failed.""},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""The version of the artifact for which the metadata download failed.""},{""name"":""mavenRepositoryUri"",""type"":""String"",""displayName"":""Maven repository"",""description"":""The URL of the Maven repository that the metadata download failed on.""},{""name"":""snapshots"",""type"":""String"",""displayName"":""Snapshots"",""description"":""Does the repository support snapshots.""},{""name"":""releases"",""type"":""String"",""displayName"":""Releases"",""description"":""Does the repository support releases.""},{""name"":""failure"",""type"":""String"",""displayName"":""Failure"",""description"":""The reason the metadata download failed.""}]}]"
-maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.MigrateToGradle9,Migrate to Gradle 9 from Gradle 8,Migrate to version 9.x. See the Gradle upgrade guide from [version 8.x to 9.0](https://docs.gradle.org/9.0.0/userguide/upgrading_major_version_9.html) for more information.,38,,Gradle,,"[{""name"":""org.openrewrite.maven.table.MavenMetadataFailures"",""displayName"":""Maven metadata failures"",""instanceName"":""Maven metadata failures"",""description"":""Attempts to resolve maven metadata that failed."",""columns"":[{""name"":""group"",""type"":""String"",""displayName"":""Group id"",""description"":""The groupId of the artifact for which the metadata download failed.""},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact id"",""description"":""The artifactId of the artifact for which the metadata download failed.""},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""The version of the artifact for which the metadata download failed.""},{""name"":""mavenRepositoryUri"",""type"":""String"",""displayName"":""Maven repository"",""description"":""The URL of the Maven repository that the metadata download failed on.""},{""name"":""snapshots"",""type"":""String"",""displayName"":""Snapshots"",""description"":""Does the repository support snapshots.""},{""name"":""releases"",""type"":""String"",""displayName"":""Releases"",""description"":""Does the repository support releases.""},{""name"":""failure"",""type"":""String"",""displayName"":""Failure"",""description"":""The reason the metadata download failed.""}]}]"
-maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.GradleBestPractices,Apply Gradle best practices,"Apply a set of [Gradle best practices](https://docs.gradle.org/current/userguide/best_practices_general.html) to the build files, for more efficient and ideomatic builds.",44,,Gradle,,"[{""name"":""org.openrewrite.maven.table.MavenMetadataFailures"",""displayName"":""Maven metadata failures"",""instanceName"":""Maven metadata failures"",""description"":""Attempts to resolve maven metadata that failed."",""columns"":[{""name"":""group"",""type"":""String"",""displayName"":""Group id"",""description"":""The groupId of the artifact for which the metadata download failed.""},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact id"",""description"":""The artifactId of the artifact for which the metadata download failed.""},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""The version of the artifact for which the metadata download failed.""},{""name"":""mavenRepositoryUri"",""type"":""String"",""displayName"":""Maven repository"",""description"":""The URL of the Maven repository that the metadata download failed on.""},{""name"":""snapshots"",""type"":""String"",""displayName"":""Snapshots"",""description"":""Does the repository support snapshots.""},{""name"":""releases"",""type"":""String"",""displayName"":""Releases"",""description"":""Does the repository support releases.""},{""name"":""failure"",""type"":""String"",""displayName"":""Failure"",""description"":""The reason the metadata download failed.""}]}]"
+maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.MigrateToGradle9,Migrate to Gradle 9 from Gradle 8,Migrate to version 9.x. See the Gradle upgrade guide from [version 8.x to 9.0](https://docs.gradle.org/9.0.0/userguide/upgrading_major_version_9.html) for more information.,40,,Gradle,,"[{""name"":""org.openrewrite.maven.table.MavenMetadataFailures"",""displayName"":""Maven metadata failures"",""instanceName"":""Maven metadata failures"",""description"":""Attempts to resolve maven metadata that failed."",""columns"":[{""name"":""group"",""type"":""String"",""displayName"":""Group id"",""description"":""The groupId of the artifact for which the metadata download failed.""},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact id"",""description"":""The artifactId of the artifact for which the metadata download failed.""},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""The version of the artifact for which the metadata download failed.""},{""name"":""mavenRepositoryUri"",""type"":""String"",""displayName"":""Maven repository"",""description"":""The URL of the Maven repository that the metadata download failed on.""},{""name"":""snapshots"",""type"":""String"",""displayName"":""Snapshots"",""description"":""Does the repository support snapshots.""},{""name"":""releases"",""type"":""String"",""displayName"":""Releases"",""description"":""Does the repository support releases.""},{""name"":""failure"",""type"":""String"",""displayName"":""Failure"",""description"":""The reason the metadata download failed.""}]}]"
+maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.GradleBestPractices,Apply Gradle best practices,"Apply a set of [Gradle best practices](https://docs.gradle.org/current/userguide/best_practices_general.html) to the build files, for more efficient and idiomatic builds.",50,,Gradle,,"[{""name"":""org.openrewrite.maven.table.MavenMetadataFailures"",""displayName"":""Maven metadata failures"",""instanceName"":""Maven metadata failures"",""description"":""Attempts to resolve maven metadata that failed."",""columns"":[{""name"":""group"",""type"":""String"",""displayName"":""Group id"",""description"":""The groupId of the artifact for which the metadata download failed.""},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact id"",""description"":""The artifactId of the artifact for which the metadata download failed.""},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""The version of the artifact for which the metadata download failed.""},{""name"":""mavenRepositoryUri"",""type"":""String"",""displayName"":""Maven repository"",""description"":""The URL of the Maven repository that the metadata download failed on.""},{""name"":""snapshots"",""type"":""String"",""displayName"":""Snapshots"",""description"":""Does the repository support snapshots.""},{""name"":""releases"",""type"":""String"",""displayName"":""Releases"",""description"":""Does the repository support releases.""},{""name"":""failure"",""type"":""String"",""displayName"":""Failure"",""description"":""The reason the metadata download failed.""}]}]"
maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.EnableGradleBuildCache,Enable Gradle build cache,"Enable the Gradle build cache. By enabling build cache the build outputs are stored externally and fetched from the cache when it is determined that those inputs have no changed, avoiding the expensive work of regenerating them. See the [Gradle Build Cache](https://docs.gradle.org/current/userguide/build_cache.html) for more information.",2,,Gradle,,
maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.EnableGradleParallelExecution,Enable Gradle parallel execution,"Most builds consist of more than one project and some of those projects are usually independent of one another. Yet Gradle will only run one task at a time by default, regardless of the project structure. By using the `--parallel` switch, you can force Gradle to execute tasks in parallel as long as those tasks are in different projects. See the [Gradle performance documentation](https://docs.gradle.org/current/userguide/performance.html#parallel_execution) for more information.",2,,Gradle,,
maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.gradle8.JacocoReportDeprecations,Replace Gradle 8 introduced deprecations in JaCoCo report task,Set the `enabled` to `required` and the `destination` to `outputLocation` for Reports deprecations that were removed in gradle 8. See [the gradle docs on this topic](https://docs.gradle.org/current/userguide/upgrading_version_7.html#report_and_testreport_api_cleanup).,1,Gradle8,Gradle,,
-maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.gradle9.UseMainClassProperty,Use `mainClass` instead of `main` for `JavaExec` tasks,The `main` property on `JavaExec` tasks was deprecated in Gradle 7.1 and removed in Gradle 9.0. Use the `mainClass` property instead.,1,Gradle9,Gradle,,
-maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.plugins.AddBuildPlugin,Add Gradle plugin,Add a build plugin to a Gradle build file's `plugins` block.,1,Plugins,Gradle,"[{""name"":""pluginId"",""type"":""String"",""displayName"":""Plugin id"",""description"":""The plugin id to apply."",""example"":""com.jfrog.bintray"",""required"":true},{""name"":""version"",""type"":""String"",""displayName"":""Plugin version"",""description"":""An exact version number or node-style semver selector used to select the version number. You can also use `latest.release` for the latest available version and `latest.patch` if the current version is a valid semantic version. For more details, you can look at the documentation page of [version selectors](https://docs.openrewrite.org/reference/dependency-version-selectors)."",""example"":""3.x""},{""name"":""versionPattern"",""type"":""String"",""displayName"":""Version pattern"",""description"":""Allows version selection to be extended beyond the original Node Semver semantics. So for example,Setting 'version' to \""25-29\"" can be paired with a metadata pattern of \""-jre\"" to select Guava 29.0-jre"",""example"":""-jre""},{""name"":""apply"",""type"":""Boolean"",""displayName"":""Apply plugin"",""description"":""Immediate apply the plugin. Defaults to `true`."",""valid"":[""true"",""false""]},{""name"":""acceptTransitive"",""type"":""Boolean"",""displayName"":""Accept transitive"",""description"":""Some plugins apply other plugins. When this is set to true no plugin declaration will be added if the plugin is already applied transitively. When this is set to false the plugin will be added explicitly even if it is already applied transitively. Defaults to `true`."",""valid"":[""true"",""false""]}]",
-maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.plugins.AddDevelocityGradlePlugin,Add the Develocity Gradle plugin,Add the Develocity Gradle plugin to settings.gradle files.,1,Plugins,Gradle,"[{""name"":""version"",""type"":""String"",""displayName"":""Plugin version"",""description"":""An exact version number or node-style semver selector used to select the version number. You can also use `latest.release` for the latest available version and `latest.patch` if the current version is a valid semantic version. For more details, you can look at the documentation page of [version selectors](https://docs.openrewrite.org/reference/dependency-version-selectors). Defaults to `latest.release`."",""example"":""3.x""},{""name"":""server"",""type"":""String"",""displayName"":""Server URL"",""description"":""The URL of the Develocity server. If omitted the recipe will set no URL and Gradle will direct scans to https://scans.gradle.com/"",""example"":""https://scans.gradle.com/""},{""name"":""allowUntrustedServer"",""type"":""Boolean"",""displayName"":""Allow untrusted server"",""description"":""When set to `true` the plugin will be configured to allow unencrypted http connections with the server. If set to `false` or omitted, the plugin will refuse to communicate without transport layer security enabled."",""example"":""true""},{""name"":""captureTaskInputFiles"",""type"":""Boolean"",""displayName"":""Capture task input files"",""description"":""When set to `true` the plugin will capture additional information about the inputs to Gradle tasks. This increases the size of build scans, but is useful for diagnosing issues with task caching. "",""example"":""true""},{""name"":""uploadInBackground"",""type"":""Boolean"",""displayName"":""Upload in background"",""description"":""When set to `true` the plugin will capture additional information about the outputs of Gradle tasks. This increases the size of build scans, but is useful for diagnosing issues with task caching. "",""example"":""true""},{""name"":""publishCriteria"",""type"":""PublishCriteria"",""displayName"":""Publish criteria"",""description"":""When set to `Always` the plugin will publish build scans of every single build. When set to `Failure` the plugin will only publish build scans when the build fails. When omitted scans will be published only when the `--scan` option is passed to the build."",""example"":""Always"",""valid"":[""Always"",""Failure""]}]","[{""name"":""org.openrewrite.maven.table.MavenMetadataFailures"",""displayName"":""Maven metadata failures"",""instanceName"":""Maven metadata failures"",""description"":""Attempts to resolve maven metadata that failed."",""columns"":[{""name"":""group"",""type"":""String"",""displayName"":""Group id"",""description"":""The groupId of the artifact for which the metadata download failed.""},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact id"",""description"":""The artifactId of the artifact for which the metadata download failed.""},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""The version of the artifact for which the metadata download failed.""},{""name"":""mavenRepositoryUri"",""type"":""String"",""displayName"":""Maven repository"",""description"":""The URL of the Maven repository that the metadata download failed on.""},{""name"":""snapshots"",""type"":""String"",""displayName"":""Snapshots"",""description"":""Does the repository support snapshots.""},{""name"":""releases"",""type"":""String"",""displayName"":""Releases"",""description"":""Does the repository support releases.""},{""name"":""failure"",""type"":""String"",""displayName"":""Failure"",""description"":""The reason the metadata download failed.""}]}]"
-maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.plugins.AddSettingsPlugin,Add Gradle settings plugin,Add plugin to Gradle settings file `plugins` block by id.,1,Plugins,Gradle,"[{""name"":""pluginId"",""type"":""String"",""displayName"":""Plugin id"",""description"":""The plugin id to apply."",""example"":""com.jfrog.bintray"",""required"":true},{""name"":""version"",""type"":""String"",""displayName"":""Plugin version"",""description"":""An exact version number or node-style semver selector used to select the version number. You can also use `latest.release` for the latest available version and `latest.patch` if the current version is a valid semantic version. For more details, you can look at the documentation page of [version selectors](https://docs.openrewrite.org/reference/dependency-version-selectors). Defaults to `latest.release`."",""example"":""3.x""},{""name"":""versionPattern"",""type"":""String"",""displayName"":""Version pattern"",""description"":""Allows version selection to be extended beyond the original Node Semver semantics. So for example,Setting 'version' to \""25-29\"" can be paired with a metadata pattern of \""-jre\"" to select Guava 29.0-jre"",""example"":""-jre""},{""name"":""apply"",""type"":""Boolean"",""displayName"":""Apply plugin"",""description"":""Immediate apply the plugin. Defaults to `true`."",""valid"":[""true"",""false""]},{""name"":""acceptTransitive"",""type"":""Boolean"",""displayName"":""Accept transitive"",""description"":""Some plugins apply other plugins. When this is set to true no plugin declaration will be added if the plugin is already applied transitively. When this is set to false the plugin will be added explicitly even if it is already applied transitively. Defaults to `true`."",""valid"":[""true"",""false""]}]",
-maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.plugins.AddSettingsPluginRepository,Add a Gradle settings repository,Add a Gradle settings repository to `settings.gradle(.kts)`.,1,Plugins,Gradle,"[{""name"":""type"",""type"":""String"",""displayName"":""Type"",""description"":""The type of the artifact repository"",""example"":""maven"",""required"":true},{""name"":""url"",""type"":""String"",""displayName"":""URL"",""description"":""The url of the artifact repository"",""example"":""https://repo.spring.io""}]",
+maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.gradle9.UseMainClassPropertyForApplication,Use `mainClass` instead of `mainClassName` in the `application` block,The `mainClassName` property on the `application` extension was deprecated in Gradle 6.4 and removed in Gradle 9.0. Use the `mainClass` property instead. See the [Gradle upgrade guide](https://docs.gradle.org/9.0.0/userguide/upgrading_major_version_9.html) for more information.,1,Gradle9,Gradle,,
+maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.gradle9.UseMainClassProperty,Use `mainClass` instead of `main` for `JavaExec` tasks,The `main` property on `JavaExec` tasks was deprecated in Gradle 7.1 and removed in Gradle 9.0. Use the `mainClass` property instead. See the [Gradle upgrade guide](https://docs.gradle.org/9.0.0/userguide/upgrading_major_version_9.html) for more information.,1,Gradle9,Gradle,,
maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.plugins.ChangePlugin,Change a Gradle plugin,Changes the selected Gradle plugin to the new plugin.,1,Plugins,Gradle,"[{""name"":""pluginId"",""type"":""String"",""displayName"":""Plugin ID"",""description"":""The current Gradle plugin id."",""example"":""org.openrewrite.rewrite"",""required"":true},{""name"":""newPluginId"",""type"":""String"",""displayName"":""New plugin ID"",""description"":""The new Gradle plugin id."",""example"":""org.openrewrite.rewrite"",""required"":true},{""name"":""newVersion"",""type"":""String"",""displayName"":""New plugin version"",""description"":""An exact version number or node-style semver selector used to select the version number. You can also use `latest.release` for the latest available version and `latest.patch` if the current version is a valid semantic version. For more details, you can look at the documentation page of [version selectors](https://docs.openrewrite.org/reference/dependency-version-selectors)."",""example"":""7.x""}]","[{""name"":""org.openrewrite.maven.table.MavenMetadataFailures"",""displayName"":""Maven metadata failures"",""instanceName"":""Maven metadata failures"",""description"":""Attempts to resolve maven metadata that failed."",""columns"":[{""name"":""group"",""type"":""String"",""displayName"":""Group id"",""description"":""The groupId of the artifact for which the metadata download failed.""},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact id"",""description"":""The artifactId of the artifact for which the metadata download failed.""},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""The version of the artifact for which the metadata download failed.""},{""name"":""mavenRepositoryUri"",""type"":""String"",""displayName"":""Maven repository"",""description"":""The URL of the Maven repository that the metadata download failed on.""},{""name"":""snapshots"",""type"":""String"",""displayName"":""Snapshots"",""description"":""Does the repository support snapshots.""},{""name"":""releases"",""type"":""String"",""displayName"":""Releases"",""description"":""Does the repository support releases.""},{""name"":""failure"",""type"":""String"",""displayName"":""Failure"",""description"":""The reason the metadata download failed.""}]}]"
maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.plugins.ChangePluginVersion,Change a Gradle plugin version by id,Change a Gradle plugin by id to a later version.,1,Plugins,Gradle,"[{""name"":""pluginIdPattern"",""type"":""String"",""displayName"":""Plugin id"",""description"":""The `ID` part of `plugin { ID }`, as a glob expression."",""example"":""com.jfrog.bintray"",""required"":true},{""name"":""newVersion"",""type"":""String"",""displayName"":""New version"",""description"":""An exact version number or node-style semver selector used to select the version number. You can also use `latest.release` for the latest available version and `latest.patch` if the current version is a valid semantic version. For more details, you can look at the documentation page of [version selectors](https://docs.openrewrite.org/reference/dependency-version-selectors). Defaults to `latest.release`."",""example"":""29.X""},{""name"":""versionPattern"",""type"":""String"",""displayName"":""Version pattern"",""description"":""Allows version selection to be extended beyond the original Node Semver semantics. So for example,Setting 'version' to \""25-29\"" can be paired with a metadata pattern of \""-jre\"" to select Guava 29.0-jre"",""example"":""-jre""}]","[{""name"":""org.openrewrite.maven.table.MavenMetadataFailures"",""displayName"":""Maven metadata failures"",""instanceName"":""Maven metadata failures"",""description"":""Attempts to resolve maven metadata that failed."",""columns"":[{""name"":""group"",""type"":""String"",""displayName"":""Group id"",""description"":""The groupId of the artifact for which the metadata download failed.""},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact id"",""description"":""The artifactId of the artifact for which the metadata download failed.""},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""The version of the artifact for which the metadata download failed.""},{""name"":""mavenRepositoryUri"",""type"":""String"",""displayName"":""Maven repository"",""description"":""The URL of the Maven repository that the metadata download failed on.""},{""name"":""snapshots"",""type"":""String"",""displayName"":""Snapshots"",""description"":""Does the repository support snapshots.""},{""name"":""releases"",""type"":""String"",""displayName"":""Releases"",""description"":""Does the repository support releases.""},{""name"":""failure"",""type"":""String"",""displayName"":""Failure"",""description"":""The reason the metadata download failed.""}]}]"
-maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.plugins.MigrateGradleEnterpriseToDevelocity,Migrate from Gradle Enterprise to Develocity,Migrate from the Gradle Enterprise Gradle plugin to the Develocity Gradle plugin.,1,Plugins,Gradle,"[{""name"":""version"",""type"":""String"",""displayName"":""Plugin version"",""description"":""An exact version number or node-style semver selector used to select the version number. You can also use `latest.release` for the latest available version and `latest.patch` if the current version is a valid semantic version. For more details, you can look at the documentation page of [version selectors](https://docs.openrewrite.org/reference/dependency-version-selectors). Defaults to `latest.release`."",""example"":""3.x""}]","[{""name"":""org.openrewrite.maven.table.MavenMetadataFailures"",""displayName"":""Maven metadata failures"",""instanceName"":""Maven metadata failures"",""description"":""Attempts to resolve maven metadata that failed."",""columns"":[{""name"":""group"",""type"":""String"",""displayName"":""Group id"",""description"":""The groupId of the artifact for which the metadata download failed.""},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact id"",""description"":""The artifactId of the artifact for which the metadata download failed.""},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""The version of the artifact for which the metadata download failed.""},{""name"":""mavenRepositoryUri"",""type"":""String"",""displayName"":""Maven repository"",""description"":""The URL of the Maven repository that the metadata download failed on.""},{""name"":""snapshots"",""type"":""String"",""displayName"":""Snapshots"",""description"":""Does the repository support snapshots.""},{""name"":""releases"",""type"":""String"",""displayName"":""Releases"",""description"":""Does the repository support releases.""},{""name"":""failure"",""type"":""String"",""displayName"":""Failure"",""description"":""The reason the metadata download failed.""}]}]"
+maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.plugins.AddDevelocityGradlePlugin,Add the Develocity Gradle plugin,Add the Develocity Gradle plugin to settings.gradle files.,1,Plugins,Gradle,"[{""name"":""version"",""type"":""String"",""displayName"":""Plugin version"",""description"":""An exact version number or node-style semver selector used to select the version number. You can also use `latest.release` for the latest available version and `latest.patch` if the current version is a valid semantic version. For more details, you can look at the documentation page of [version selectors](https://docs.openrewrite.org/reference/dependency-version-selectors). Defaults to `latest.release`."",""example"":""3.x""},{""name"":""server"",""type"":""String"",""displayName"":""Server URL"",""description"":""The URL of the Develocity server. If omitted the recipe will set no URL and Gradle will direct scans to https://scans.gradle.com/"",""example"":""https://scans.gradle.com/""},{""name"":""allowUntrustedServer"",""type"":""Boolean"",""displayName"":""Allow untrusted server"",""description"":""When set to `true` the plugin will be configured to allow unencrypted http connections with the server. If set to `false` or omitted, the plugin will refuse to communicate without transport layer security enabled."",""example"":""true""},{""name"":""captureTaskInputFiles"",""type"":""Boolean"",""displayName"":""Capture task input files"",""description"":""When set to `true` the plugin will capture additional information about the inputs to Gradle tasks. This increases the size of build scans, but is useful for diagnosing issues with task caching. "",""example"":""true""},{""name"":""uploadInBackground"",""type"":""Boolean"",""displayName"":""Upload in background"",""description"":""When set to `true` the plugin will capture additional information about the outputs of Gradle tasks. This increases the size of build scans, but is useful for diagnosing issues with task caching. "",""example"":""true""},{""name"":""publishCriteria"",""type"":""PublishCriteria"",""displayName"":""Publish criteria"",""description"":""When set to `Always` the plugin will publish build scans of every single build. When set to `Failure` the plugin will only publish build scans when the build fails. When omitted scans will be published only when the `--scan` option is passed to the build."",""example"":""Always"",""valid"":[""Always"",""Failure""]}]","[{""name"":""org.openrewrite.maven.table.MavenMetadataFailures"",""displayName"":""Maven metadata failures"",""instanceName"":""Maven metadata failures"",""description"":""Attempts to resolve maven metadata that failed."",""columns"":[{""name"":""group"",""type"":""String"",""displayName"":""Group id"",""description"":""The groupId of the artifact for which the metadata download failed.""},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact id"",""description"":""The artifactId of the artifact for which the metadata download failed.""},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""The version of the artifact for which the metadata download failed.""},{""name"":""mavenRepositoryUri"",""type"":""String"",""displayName"":""Maven repository"",""description"":""The URL of the Maven repository that the metadata download failed on.""},{""name"":""snapshots"",""type"":""String"",""displayName"":""Snapshots"",""description"":""Does the repository support snapshots.""},{""name"":""releases"",""type"":""String"",""displayName"":""Releases"",""description"":""Does the repository support releases.""},{""name"":""failure"",""type"":""String"",""displayName"":""Failure"",""description"":""The reason the metadata download failed.""}]}]"
+maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.plugins.RemoveSettingsPlugin,Remove Gradle settings plugin,Remove plugin from Gradle settings file `plugins` block by id.,1,Plugins,Gradle,"[{""name"":""pluginId"",""type"":""String"",""displayName"":""Plugin id"",""description"":""The plugin id to remove."",""example"":""com.jfrog.bintray"",""required"":true}]",
maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.plugins.RemoveBuildPlugin,Remove Gradle plugin,Remove plugin from Gradle `plugins` block by its id. Does not remove plugins from the `buildscript` block.,1,Plugins,Gradle,"[{""name"":""pluginId"",""type"":""String"",""displayName"":""Plugin id"",""description"":""The plugin id to remove."",""example"":""com.jfrog.bintray"",""required"":true}]",
+maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.plugins.AddSettingsPlugin,Add Gradle settings plugin,Add plugin to Gradle settings file `plugins` block by id.,1,Plugins,Gradle,"[{""name"":""pluginId"",""type"":""String"",""displayName"":""Plugin id"",""description"":""The plugin id to apply."",""example"":""com.jfrog.bintray"",""required"":true},{""name"":""version"",""type"":""String"",""displayName"":""Plugin version"",""description"":""An exact version number or node-style semver selector used to select the version number. You can also use `latest.release` for the latest available version and `latest.patch` if the current version is a valid semantic version. For more details, you can look at the documentation page of [version selectors](https://docs.openrewrite.org/reference/dependency-version-selectors). Defaults to `latest.release`."",""example"":""3.x""},{""name"":""versionPattern"",""type"":""String"",""displayName"":""Version pattern"",""description"":""Allows version selection to be extended beyond the original Node Semver semantics. So for example,Setting 'version' to \""25-29\"" can be paired with a metadata pattern of \""-jre\"" to select Guava 29.0-jre"",""example"":""-jre""},{""name"":""apply"",""type"":""Boolean"",""displayName"":""Apply plugin"",""description"":""Immediate apply the plugin. Defaults to `true`."",""valid"":[""true"",""false""]},{""name"":""acceptTransitive"",""type"":""Boolean"",""displayName"":""Accept transitive"",""description"":""Some plugins apply other plugins. When this is set to true no plugin declaration will be added if the plugin is already applied transitively. When this is set to false the plugin will be added explicitly even if it is already applied transitively. Defaults to `true`."",""valid"":[""true"",""false""]}]",
+maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.plugins.MigrateGradleEnterpriseToDevelocity,Migrate from Gradle Enterprise to Develocity,Migrate from the Gradle Enterprise Gradle plugin to the Develocity Gradle plugin.,1,Plugins,Gradle,"[{""name"":""version"",""type"":""String"",""displayName"":""Plugin version"",""description"":""An exact version number or node-style semver selector used to select the version number. You can also use `latest.release` for the latest available version and `latest.patch` if the current version is a valid semantic version. For more details, you can look at the documentation page of [version selectors](https://docs.openrewrite.org/reference/dependency-version-selectors). Defaults to `latest.release`."",""example"":""3.x""}]","[{""name"":""org.openrewrite.maven.table.MavenMetadataFailures"",""displayName"":""Maven metadata failures"",""instanceName"":""Maven metadata failures"",""description"":""Attempts to resolve maven metadata that failed."",""columns"":[{""name"":""group"",""type"":""String"",""displayName"":""Group id"",""description"":""The groupId of the artifact for which the metadata download failed.""},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact id"",""description"":""The artifactId of the artifact for which the metadata download failed.""},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""The version of the artifact for which the metadata download failed.""},{""name"":""mavenRepositoryUri"",""type"":""String"",""displayName"":""Maven repository"",""description"":""The URL of the Maven repository that the metadata download failed on.""},{""name"":""snapshots"",""type"":""String"",""displayName"":""Snapshots"",""description"":""Does the repository support snapshots.""},{""name"":""releases"",""type"":""String"",""displayName"":""Releases"",""description"":""Does the repository support releases.""},{""name"":""failure"",""type"":""String"",""displayName"":""Failure"",""description"":""The reason the metadata download failed.""}]}]"
maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.plugins.RemoveDevelocityConfiguration,Remove Develocity configuration,Remove the Develocity Gradle plugin and associated configuration.,3,Plugins,Gradle,,
-maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.plugins.RemoveSettingsPlugin,Remove Gradle settings plugin,Remove plugin from Gradle settings file `plugins` block by id.,1,Plugins,Gradle,"[{""name"":""pluginId"",""type"":""String"",""displayName"":""Plugin id"",""description"":""The plugin id to remove."",""example"":""com.jfrog.bintray"",""required"":true}]",
maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.plugins.UpgradePluginVersion,Update a Gradle plugin by id,"Update a Gradle plugin by id to a later version defined by the plugins DSL. To upgrade a plugin dependency defined by `buildscript.dependencies`, use the `UpgradeDependencyVersion` recipe instead.",1,Plugins,Gradle,"[{""name"":""pluginIdPattern"",""type"":""String"",""displayName"":""Plugin id"",""description"":""The `ID` part of `plugin { ID }`, as a glob expression."",""example"":""com.jfrog.bintray"",""required"":true},{""name"":""newVersion"",""type"":""String"",""displayName"":""New version"",""description"":""An exact version number or node-style semver selector used to select the version number. You can also use `latest.release` for the latest available version and `latest.patch` if the current version is a valid semantic version. For more details, you can look at the documentation page of [version selectors](https://docs.openrewrite.org/reference/dependency-version-selectors). Defaults to `latest.release`."",""example"":""29.X""},{""name"":""versionPattern"",""type"":""String"",""displayName"":""Version pattern"",""description"":""Allows version selection to be extended beyond the original Node Semver semantics. So for example,Setting 'version' to \""25-29\"" can be paired with a metadata pattern of \""-jre\"" to select Guava 29.0-jre"",""example"":""-jre""}]","[{""name"":""org.openrewrite.maven.table.MavenMetadataFailures"",""displayName"":""Maven metadata failures"",""instanceName"":""Maven metadata failures"",""description"":""Attempts to resolve maven metadata that failed."",""columns"":[{""name"":""group"",""type"":""String"",""displayName"":""Group id"",""description"":""The groupId of the artifact for which the metadata download failed.""},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact id"",""description"":""The artifactId of the artifact for which the metadata download failed.""},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""The version of the artifact for which the metadata download failed.""},{""name"":""mavenRepositoryUri"",""type"":""String"",""displayName"":""Maven repository"",""description"":""The URL of the Maven repository that the metadata download failed on.""},{""name"":""snapshots"",""type"":""String"",""displayName"":""Snapshots"",""description"":""Does the repository support snapshots.""},{""name"":""releases"",""type"":""String"",""displayName"":""Releases"",""description"":""Does the repository support releases.""},{""name"":""failure"",""type"":""String"",""displayName"":""Failure"",""description"":""The reason the metadata download failed.""}]}]"
+maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.plugins.AddBuildPlugin,Add Gradle plugin,Add a build plugin to a Gradle build file's `plugins` block.,1,Plugins,Gradle,"[{""name"":""pluginId"",""type"":""String"",""displayName"":""Plugin id"",""description"":""The plugin id to apply."",""example"":""com.jfrog.bintray"",""required"":true},{""name"":""version"",""type"":""String"",""displayName"":""Plugin version"",""description"":""An exact version number or node-style semver selector used to select the version number. You can also use `latest.release` for the latest available version and `latest.patch` if the current version is a valid semantic version. For more details, you can look at the documentation page of [version selectors](https://docs.openrewrite.org/reference/dependency-version-selectors)."",""example"":""3.x""},{""name"":""versionPattern"",""type"":""String"",""displayName"":""Version pattern"",""description"":""Allows version selection to be extended beyond the original Node Semver semantics. So for example,Setting 'version' to \""25-29\"" can be paired with a metadata pattern of \""-jre\"" to select Guava 29.0-jre"",""example"":""-jre""},{""name"":""apply"",""type"":""Boolean"",""displayName"":""Apply plugin"",""description"":""Immediate apply the plugin. Defaults to `true`."",""valid"":[""true"",""false""]},{""name"":""acceptTransitive"",""type"":""Boolean"",""displayName"":""Accept transitive"",""description"":""Some plugins apply other plugins. When this is set to true no plugin declaration will be added if the plugin is already applied transitively. When this is set to false the plugin will be added explicitly even if it is already applied transitively. Defaults to `true`."",""valid"":[""true"",""false""]}]",
+maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.plugins.AddSettingsPluginRepository,Add a Gradle settings repository,Add a Gradle settings repository to `settings.gradle(.kts)`.,1,Plugins,Gradle,"[{""name"":""type"",""type"":""String"",""displayName"":""Type"",""description"":""The type of the artifact repository"",""example"":""maven"",""required"":true},{""name"":""url"",""type"":""String"",""displayName"":""URL"",""description"":""The url of the artifact repository"",""example"":""https://repo.spring.io""}]",
maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.plugins.RemoveDevelocity,Remove Develocity,Remove the Develocity plugin and configuration from the Gradle build and settings files.,8,Plugins,Gradle,,
-maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.search.DependencyInsight,Gradle dependency insight,"Find direct and transitive dependencies matching a group, artifact, resolved version, and optionally a configuration name. Results include dependencies that either directly match or transitively include a matching dependency.",1,Search,Gradle,"[{""name"":""groupIdPattern"",""type"":""String"",""displayName"":""Group pattern"",""description"":""Group glob pattern used to match dependencies."",""example"":""com.fasterxml.jackson.module"",""required"":true},{""name"":""artifactIdPattern"",""type"":""String"",""displayName"":""Artifact pattern"",""description"":""Artifact glob pattern used to match dependencies."",""example"":""jackson-module-*"",""required"":true},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""Match only dependencies with the specified resolved version. Node-style [version selectors](https://docs.openrewrite.org/reference/dependency-version-selectors) may be used.All versions are searched by default."",""example"":""1.x""},{""name"":""configuration"",""type"":""String"",""displayName"":""Scope"",""description"":""Match dependencies with the specified scope. If not specified, all configurations will be searched."",""example"":""compileClasspath""}]","[{""name"":""org.openrewrite.maven.table.DependenciesInUse"",""displayName"":""Dependencies in use"",""instanceName"":""Dependencies in use"",""description"":""Direct and transitive dependencies in use."",""columns"":[{""name"":""projectName"",""type"":""String"",""displayName"":""Project name"",""description"":""The name of the project that contains the dependency.""},{""name"":""sourceSet"",""type"":""String"",""displayName"":""Source set"",""description"":""The source set that contains the dependency.""},{""name"":""groupId"",""type"":""String"",""displayName"":""Group"",""description"":""The first part of a dependency coordinate `com.google.guava:guava:VERSION`.""},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact"",""description"":""The second part of a dependency coordinate `com.google.guava:guava:VERSION`.""},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""The resolved version.""},{""name"":""datedSnapshotVersion"",""type"":""String"",""displayName"":""Dated snapshot version"",""description"":""The resolved dated snapshot version or `null` if this dependency is not a snapshot.""},{""name"":""scope"",""type"":""String"",""displayName"":""Scope"",""description"":""Dependency scope. This will be `compile` if the dependency is direct and a scope is not explicitly specified in the POM.""},{""name"":""count"",""type"":""Integer"",""displayName"":""Count"",""description"":""How many times does this dependency appear.""}]},{""name"":""org.openrewrite.maven.table.ExplainDependenciesInUse"",""displayName"":""Explain dependencies in use"",""instanceName"":""Explain dependencies in use"",""description"":""A dependency graph explainer similar to that shown by `gradle dependencyInsight` for each matching dependency. This table will contain a row per matching dependency per configuration per (sub)project."",""columns"":[{""name"":""projectName"",""type"":""String"",""displayName"":""Project name"",""description"":""The name of the project that contains the dependency.""},{""name"":""sourceSet"",""type"":""String"",""displayName"":""Source set"",""description"":""The source set that contains the dependency.""},{""name"":""groupId"",""type"":""String"",""displayName"":""Group"",""description"":""The first part of a dependency coordinate `com.google.guava:guava:VERSION`.""},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact"",""description"":""The second part of a dependency coordinate `com.google.guava:guava:VERSION`.""},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""The resolved version.""},{""name"":""datedSnapshotVersion"",""type"":""String"",""displayName"":""Dated snapshot version"",""description"":""The resolved dated snapshot version or `null` if this dependency is not a snapshot.""},{""name"":""scope"",""type"":""String"",""displayName"":""Scope"",""description"":""Dependency scope. This will be `compile` if the dependency is direct and a scope is not explicitly specified in the POM.""},{""name"":""count"",""type"":""Integer"",""displayName"":""Count"",""description"":""How many times does this dependency appear.""},{""name"":""dependencyGraph"",""type"":""String"",""displayName"":""Dependency graph"",""description"":""The dependency paths that requested the dependency.""}]}]"
+maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.search.FindPlugins,Find Gradle plugin,"Find a Gradle plugin by id and/or class name. For best results both should be specified, as one cannot automatically be used to infer the other.",1,Search,Gradle,"[{""name"":""pluginId"",""type"":""String"",""displayName"":""Plugin id"",""description"":""The unique identifier used to apply a plugin in the `plugins` block. Note that this alone is insufficient to search for plugins applied by fully qualified class name and the `buildscript` block."",""example"":""`com.jfrog.bintray`"",""required"":true},{""name"":""pluginClass"",""type"":""String"",""displayName"":""Plugin class"",""description"":""The fully qualified name of a class implementing a Gradle plugin. "",""example"":""com.jfrog.bintray.gradle.BintrayPlugin""}]",
+maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.search.EffectiveGradleRepositories,List effective Gradle project repositories,"Lists the Gradle project repositories that would be used for dependency resolution, in order of precedence. This includes Maven repositories defined in the Gradle build files and settings as determined when the LST was produced.",1,Search,Gradle,"[{""name"":""useMarkers"",""type"":""Boolean"",""displayName"":""Use markers"",""description"":""Whether to add markers for each effective Gradle repository to the build file. Default `false`.""}]","[{""name"":""org.openrewrite.maven.search.EffectiveMavenRepositoriesTable"",""displayName"":""Effective Maven repositories"",""instanceName"":""Effective Maven repositories"",""description"":""Table showing which Maven repositories were used in dependency resolution for this POM."",""columns"":[{""name"":""pomPath"",""type"":""String"",""displayName"":""POM path"",""description"":""The path to the POM file.""},{""name"":""repositoryUri"",""type"":""String"",""displayName"":""Repository URI"",""description"":""The URI of the Maven repository.""}]}]"
maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.search.DoesNotIncludeDependency,Does not include Gradle dependency,"A precondition which returns false if visiting a Gradle file which includes the specified dependency in the classpath of some scope. For compatibility with multimodule projects, this should most often be applied as a precondition.",1,Search,Gradle,"[{""name"":""groupId"",""type"":""String"",""displayName"":""Group"",""description"":""The first part of a dependency coordinate `com.google.guava:guava:VERSION`. Supports glob."",""example"":""com.google.guava"",""required"":true},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact"",""description"":""The second part of a dependency coordinate `com.google.guava:guava:VERSION`. Supports glob."",""example"":""guava"",""required"":true},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""Match only dependencies with the specified resolved version. Node-style [version selectors](https://docs.openrewrite.org/reference/dependency-version-selectors) may be used. All versions are searched by default."",""example"":""1.x""},{""name"":""configuration"",""type"":""String"",""displayName"":""Scope"",""description"":""Match dependencies with the specified scope. If not specified, all configurations will be searched."",""example"":""compileClasspath""}]",
+maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.search.FindJVMTestSuites,Find Gradle JVMTestSuite plugin configuration,Find Gradle JVMTestSuite plugin configurations and produce a data table.,1,Search,Gradle,"[{""name"":""insertRows"",""type"":""Boolean"",""displayName"":""Insert rows"",""description"":""Whether to insert rows into the table. Defaults to true."",""required"":true}]","[{""name"":""org.openrewrite.gradle.table.JVMTestSuitesDefined"",""displayName"":""`JVMTestSuites` "",""instanceName"":""`JVMTestSuites` "",""description"":""The Gradle `JVMTestSuites` that are configured in a build."",""columns"":[{""name"":""name"",""type"":""String"",""displayName"":""`JVMTestSuite` name"",""description"":""Name of the defined `JVMTestSuite`.""}]}]"
+maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.search.ModuleHasDependency,Module has dependency,"Searches for Gradle Projects (modules) that have a dependency matching the specified id or implementing class. Places a `SearchResult` marker on all sources within a project with a matching dependency. This recipe is intended to be used as a precondition for other recipes. For example this could be used to limit the application of a spring boot migration to only projects that use spring-boot-starter, limiting unnecessary upgrading. If the search result you want is instead just the build.gradle(.kts) file that use the dependency, use the `FindDependency` recipe instead.",1,Search,Gradle,"[{""name"":""groupIdPattern"",""type"":""String"",""displayName"":""Group pattern"",""description"":""Group glob pattern used to match dependencies."",""example"":""com.fasterxml.jackson.module"",""required"":true},{""name"":""artifactIdPattern"",""type"":""String"",""displayName"":""Artifact pattern"",""description"":""Artifact glob pattern used to match dependencies."",""example"":""jackson-module-*"",""required"":true},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""Match only dependencies with the specified version. Node-style [version selectors](https://docs.openrewrite.org/reference/dependency-version-selectors) may be used.All versions are searched by default."",""example"":""1.x""},{""name"":""configuration"",""type"":""String"",""displayName"":""Scope"",""description"":""Match dependencies with the specified scope. If not specified, all configurations will be searched."",""example"":""compileClasspath""}]",
+maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.search.FindGradleProject,Find Gradle projects,Gradle projects are those with `build.gradle` or `build.gradle.kts` files.,1,Search,Gradle,"[{""name"":""searchCriteria"",""type"":""SearchCriteria"",""displayName"":""Search criteria"",""description"":""Whether to identify gradle projects by source file name or the presence of a marker"",""example"":""Marker"",""valid"":[""File"",""Marker""],""required"":true}]",
maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.search.EffectiveGradlePluginRepositories,List effective Gradle plugin repositories,"Lists the Gradle plugin repositories that would be used for plugin resolution, in order of precedence. This includes Maven repositories defined in the settings.gradle pluginManagement section and build.gradle buildscript repositories as determined when the LST was produced.",1,Search,Gradle,"[{""name"":""useMarkers"",""type"":""Boolean"",""displayName"":""Use markers"",""description"":""Whether to add markers for each effective Gradle plugin repository to the build or settings file. Default `false`.""}]","[{""name"":""org.openrewrite.maven.search.EffectiveMavenRepositoriesTable"",""displayName"":""Effective Maven repositories"",""instanceName"":""Effective Maven repositories"",""description"":""Table showing which Maven repositories were used in dependency resolution for this POM."",""columns"":[{""name"":""pomPath"",""type"":""String"",""displayName"":""POM path"",""description"":""The path to the POM file.""},{""name"":""repositoryUri"",""type"":""String"",""displayName"":""Repository URI"",""description"":""The URI of the Maven repository.""}]}]"
-maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.search.EffectiveGradleRepositories,List effective Gradle project repositories,"Lists the Gradle project repositories that would be used for dependency resolution, in order of precedence. This includes Maven repositories defined in the Gradle build files and settings as determined when the LST was produced.",1,Search,Gradle,"[{""name"":""useMarkers"",""type"":""Boolean"",""displayName"":""Use markers"",""description"":""Whether to add markers for each effective Gradle repository to the build file. Default `false`.""}]","[{""name"":""org.openrewrite.maven.search.EffectiveMavenRepositoriesTable"",""displayName"":""Effective Maven repositories"",""instanceName"":""Effective Maven repositories"",""description"":""Table showing which Maven repositories were used in dependency resolution for this POM."",""columns"":[{""name"":""pomPath"",""type"":""String"",""displayName"":""POM path"",""description"":""The path to the POM file.""},{""name"":""repositoryUri"",""type"":""String"",""displayName"":""Repository URI"",""description"":""The URI of the Maven repository.""}]}]"
+maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.search.FindRepositoryOrder,Gradle repository order,Determine the order in which dependencies will be resolved for each `build.gradle` based on its defined repositories as determined when the LST was produced.,1,Search,Gradle,,"[{""name"":""org.openrewrite.maven.table.MavenRepositoryOrder"",""displayName"":""Maven repository order"",""instanceName"":""Maven repository order"",""description"":""The order in which dependencies will be resolved for each `pom.xml` based on its defined repositories and effective `settings.xml`."",""columns"":[{""name"":""id"",""type"":""String"",""displayName"":""Repository ID"",""description"":""The ID of the repository. Note that projects may define the same physical repository with different IDs.""},{""name"":""uri"",""type"":""String"",""displayName"":""Repository URI"",""description"":""The URI of the repository.""},{""name"":""knownToExist"",""type"":""boolean"",""displayName"":""Known to exist"",""description"":""If the repository is provably reachable. If false, does not guarantee that the repository does not exist.""},{""name"":""rank"",""type"":""int"",""displayName"":""Rank"",""description"":""The index order of this repository in the repository list.""}]}]"
+maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.search.FindRepository,Find Gradle repository,Find a Gradle repository by url.,1,Search,Gradle,"[{""name"":""type"",""type"":""String"",""displayName"":""Type"",""description"":""The type of the artifact repository"",""example"":""maven""},{""name"":""url"",""type"":""String"",""displayName"":""URL"",""description"":""The url of the artifact repository"",""example"":""https://repo.spring.io""},{""name"":""purpose"",""type"":""Purpose"",""displayName"":""Purpose"",""description"":""The purpose of this repository in terms of resolving project or plugin dependencies"",""valid"":[""Project"",""Plugin""]}]",
maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.search.FindDependency,Find Gradle dependency,"Finds dependencies declared in gradle build files. See the [reference](https://docs.gradle.org/current/userguide/java_library_plugin.html#sec:java_library_configurations_graph) on Gradle configurations or the diagram below for a description of what configuration to use. A project's compile and runtime classpath is based on these configurations.
A project's test classpath is based on these configurations.
.",1,Search,Gradle,"[{""name"":""groupId"",""type"":""String"",""displayName"":""Group"",""description"":""The first part of a dependency coordinate identifying its publisher."",""example"":""com.google.guava"",""required"":true},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact"",""description"":""The second part of a dependency coordinate uniquely identifying it among artifacts from the same publisher."",""example"":""guava"",""required"":true},{""name"":""configuration"",""type"":""String"",""displayName"":""Dependency configuration"",""description"":""The dependency configuration to search for dependencies in. If omitted then all configurations will be searched."",""example"":""api""},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""An exact version number or node-style semver selector used to select the version number."",""example"":""3.0.0""},{""name"":""versionPattern"",""type"":""String"",""displayName"":""Version pattern"",""description"":""Allows version selection to be extended beyond the original Node Semver semantics. So for example,Setting 'version' to \""25-29\"" can be paired with a metadata pattern of \""-jre\"" to select Guava 29.0-jre"",""example"":""-jre""}]",
-maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.search.FindDependencyHandler,Find Gradle `dependencies` blocks,Find the dependency handler containing any number of dependency definitions.,1,Search,Gradle,,
-maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.search.FindGradleProject,Find Gradle projects,Gradle projects are those with `build.gradle` or `build.gradle.kts` files.,1,Search,Gradle,"[{""name"":""searchCriteria"",""type"":""SearchCriteria"",""displayName"":""Search criteria"",""description"":""Whether to identify gradle projects by source file name or the presence of a marker"",""example"":""Marker"",""valid"":[""File"",""Marker""],""required"":true}]",
-maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.search.FindGradleWrapper,Find Gradle wrappers,Find Gradle wrappers.,1,Search,Gradle,"[{""name"":""version"",""type"":""String"",""displayName"":""Version expression"",""description"":""A version expression representing the versions to search for"",""example"":""7.x""},{""name"":""versionPattern"",""type"":""String"",""displayName"":""Version pattern"",""description"":""Allows version selection to be extended beyond the original Node Semver semantics. So for example,Setting 'version' to \""25-29\"" can be paired with a metadata pattern of \""-jre\"" to select Guava 29.0-jre"",""example"":""-jre""},{""name"":""distribution"",""type"":""String"",""displayName"":""Distribution type"",""description"":""The distribution of Gradle to find. \""bin\"" includes Gradle binaries. \""all\"" includes Gradle binaries, source code, and documentation."",""valid"":[""bin"",""all""]}]","[{""name"":""org.openrewrite.gradle.table.GradleWrappersInUse"",""displayName"":""Gradle wrappers in use"",""instanceName"":""Gradle wrappers in use"",""description"":""Gradle wrappers in use."",""columns"":[{""name"":""version"",""type"":""String"",""displayName"":""Wrapper version"",""description"":""The version of the Gradle wrapper in use.""},{""name"":""distribution"",""type"":""String"",""displayName"":""Wrapper distribution"",""description"":""The distribution type of the Gradle wrapper in use.""}]}]"
-maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.search.FindJVMTestSuites,Find Gradle JVMTestSuite plugin configuration,Find Gradle JVMTestSuite plugin configurations and produce a data table.,1,Search,Gradle,"[{""name"":""insertRows"",""type"":""Boolean"",""displayName"":""Insert rows"",""description"":""Whether to insert rows into the table. Defaults to true."",""required"":true}]","[{""name"":""org.openrewrite.gradle.table.JVMTestSuitesDefined"",""displayName"":""`JVMTestSuites` "",""instanceName"":""`JVMTestSuites` "",""description"":""The Gradle `JVMTestSuites` that are configured in a build."",""columns"":[{""name"":""name"",""type"":""String"",""displayName"":""`JVMTestSuite` name"",""description"":""Name of the defined `JVMTestSuite`.""}]}]"
-maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.search.FindPlugins,Find Gradle plugin,"Find a Gradle plugin by id and/or class name. For best results both should be specified, as one cannot automatically be used to infer the other.",1,Search,Gradle,"[{""name"":""pluginId"",""type"":""String"",""displayName"":""Plugin id"",""description"":""The unique identifier used to apply a plugin in the `plugins` block. Note that this alone is insufficient to search for plugins applied by fully qualified class name and the `buildscript` block."",""example"":""`com.jfrog.bintray`"",""required"":true},{""name"":""pluginClass"",""type"":""String"",""displayName"":""Plugin class"",""description"":""The fully qualified name of a class implementing a Gradle plugin. "",""example"":""com.jfrog.bintray.gradle.BintrayPlugin""}]",
-maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.search.FindRepository,Find Gradle repository,Find a Gradle repository by url.,1,Search,Gradle,"[{""name"":""type"",""type"":""String"",""displayName"":""Type"",""description"":""The type of the artifact repository"",""example"":""maven""},{""name"":""url"",""type"":""String"",""displayName"":""URL"",""description"":""The url of the artifact repository"",""example"":""https://repo.spring.io""},{""name"":""purpose"",""type"":""Purpose"",""displayName"":""Purpose"",""description"":""The purpose of this repository in terms of resolving project or plugin dependencies"",""valid"":[""Project"",""Plugin""]}]",
-maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.search.FindRepositoryOrder,Gradle repository order,Determine the order in which dependencies will be resolved for each `build.gradle` based on its defined repositories as determined when the LST was produced.,1,Search,Gradle,,"[{""name"":""org.openrewrite.maven.table.MavenRepositoryOrder"",""displayName"":""Maven repository order"",""instanceName"":""Maven repository order"",""description"":""The order in which dependencies will be resolved for each `pom.xml` based on its defined repositories and effective `settings.xml`."",""columns"":[{""name"":""id"",""type"":""String"",""displayName"":""Repository ID"",""description"":""The ID of the repository. Note that projects may define the same physical repository with different IDs.""},{""name"":""uri"",""type"":""String"",""displayName"":""Repository URI"",""description"":""The URI of the repository.""},{""name"":""knownToExist"",""type"":""boolean"",""displayName"":""Known to exist"",""description"":""If the repository is provably reachable. If false, does not guarantee that the repository does not exist.""},{""name"":""rank"",""type"":""int"",""displayName"":""Rank"",""description"":""The index order of this repository in the repository list.""}]}]"
-maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.search.ModuleHasDependency,Module has dependency,"Searches for Gradle Projects (modules) that have a dependency matching the specified id or implementing class. Places a `SearchResult` marker on all sources within a project with a matching dependency. This recipe is intended to be used as a precondition for other recipes. For example this could be used to limit the application of a spring boot migration to only projects that use spring-boot-starter, limiting unnecessary upgrading. If the search result you want is instead just the build.gradle(.kts) file that use the dependency, use the `FindDependency` recipe instead.",1,Search,Gradle,"[{""name"":""groupIdPattern"",""type"":""String"",""displayName"":""Group pattern"",""description"":""Group glob pattern used to match dependencies."",""example"":""com.fasterxml.jackson.module"",""required"":true},{""name"":""artifactIdPattern"",""type"":""String"",""displayName"":""Artifact pattern"",""description"":""Artifact glob pattern used to match dependencies."",""example"":""jackson-module-*"",""required"":true},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""Match only dependencies with the specified version. Node-style [version selectors](https://docs.openrewrite.org/reference/dependency-version-selectors) may be used.All versions are searched by default."",""example"":""1.x""},{""name"":""configuration"",""type"":""String"",""displayName"":""Scope"",""description"":""Match dependencies with the specified scope. If not specified, all configurations will be searched."",""example"":""compileClasspath""}]",
+maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.search.DependencyInsight,Gradle dependency insight,"Find direct and transitive dependencies matching a group, artifact, resolved version, and optionally a configuration name. Results include dependencies that either directly match or transitively include a matching dependency.",1,Search,Gradle,"[{""name"":""groupIdPattern"",""type"":""String"",""displayName"":""Group pattern"",""description"":""Group glob pattern used to match dependencies."",""example"":""com.fasterxml.jackson.module"",""required"":true},{""name"":""artifactIdPattern"",""type"":""String"",""displayName"":""Artifact pattern"",""description"":""Artifact glob pattern used to match dependencies."",""example"":""jackson-module-*"",""required"":true},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""Match only dependencies with the specified resolved version. Node-style [version selectors](https://docs.openrewrite.org/reference/dependency-version-selectors) may be used.All versions are searched by default."",""example"":""1.x""},{""name"":""configuration"",""type"":""String"",""displayName"":""Scope"",""description"":""Match dependencies with the specified scope. If not specified, all configurations will be searched."",""example"":""compileClasspath""}]","[{""name"":""org.openrewrite.maven.table.DependenciesInUse"",""displayName"":""Dependencies in use"",""instanceName"":""Dependencies in use"",""description"":""Direct and transitive dependencies in use."",""columns"":[{""name"":""projectName"",""type"":""String"",""displayName"":""Project name"",""description"":""The name of the project that contains the dependency.""},{""name"":""sourceSet"",""type"":""String"",""displayName"":""Source set"",""description"":""The source set that contains the dependency.""},{""name"":""groupId"",""type"":""String"",""displayName"":""Group"",""description"":""The first part of a dependency coordinate `com.google.guava:guava:VERSION`.""},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact"",""description"":""The second part of a dependency coordinate `com.google.guava:guava:VERSION`.""},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""The resolved version.""},{""name"":""datedSnapshotVersion"",""type"":""String"",""displayName"":""Dated snapshot version"",""description"":""The resolved dated snapshot version or `null` if this dependency is not a snapshot.""},{""name"":""scope"",""type"":""String"",""displayName"":""Scope"",""description"":""Dependency scope. This will be `compile` if the dependency is direct and a scope is not explicitly specified in the POM.""},{""name"":""count"",""type"":""Integer"",""displayName"":""Count"",""description"":""How many times does this dependency appear.""}]},{""name"":""org.openrewrite.maven.table.ExplainDependenciesInUse"",""displayName"":""Explain dependencies in use"",""instanceName"":""Explain dependencies in use"",""description"":""A dependency graph explainer similar to that shown by `gradle dependencyInsight` for each matching dependency. This table will contain a row per matching dependency per configuration per (sub)project."",""columns"":[{""name"":""projectName"",""type"":""String"",""displayName"":""Project name"",""description"":""The name of the project that contains the dependency.""},{""name"":""sourceSet"",""type"":""String"",""displayName"":""Source set"",""description"":""The source set that contains the dependency.""},{""name"":""groupId"",""type"":""String"",""displayName"":""Group"",""description"":""The first part of a dependency coordinate `com.google.guava:guava:VERSION`.""},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact"",""description"":""The second part of a dependency coordinate `com.google.guava:guava:VERSION`.""},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""The resolved version.""},{""name"":""datedSnapshotVersion"",""type"":""String"",""displayName"":""Dated snapshot version"",""description"":""The resolved dated snapshot version or `null` if this dependency is not a snapshot.""},{""name"":""scope"",""type"":""String"",""displayName"":""Scope"",""description"":""Dependency scope. This will be `compile` if the dependency is direct and a scope is not explicitly specified in the POM.""},{""name"":""count"",""type"":""Integer"",""displayName"":""Count"",""description"":""How many times does this dependency appear.""},{""name"":""dependencyGraph"",""type"":""String"",""displayName"":""Dependency graph"",""description"":""The dependency paths that requested the dependency.""}]}]"
maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.search.ModuleHasPlugin,Module has plugin,"Searches for Gradle Projects (modules) that have a plugin matching the specified id or implementing class. Places a `SearchResult` marker on all sources within a project with a matching plugin. This recipe is intended to be used as a precondition for other recipes. For example this could be used to limit the application of a spring boot migration to only projects that apply the spring dependency management plugin, limiting unnecessary upgrading. If the search result you want is instead just the build.gradle(.kts) file applying the plugin, use the `FindPlugins` recipe instead.",1,Search,Gradle,"[{""name"":""pluginId"",""type"":""String"",""displayName"":""Plugin id"",""description"":""The unique identifier used to apply a plugin in the `plugins` block. Note that this alone is insufficient to search for plugins applied by fully qualified class name and the `buildscript` block."",""example"":""`com.jfrog.bintray`"",""required"":true},{""name"":""pluginClass"",""type"":""String"",""displayName"":""Plugin class"",""description"":""The fully qualified name of a class implementing a Gradle plugin. "",""example"":""com.jfrog.bintray.gradle.BintrayPlugin""}]",
+maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.search.FindGradleWrapper,Find Gradle wrappers,Find Gradle wrappers.,1,Search,Gradle,"[{""name"":""version"",""type"":""String"",""displayName"":""Version expression"",""description"":""A version expression representing the versions to search for"",""example"":""7.x""},{""name"":""versionPattern"",""type"":""String"",""displayName"":""Version pattern"",""description"":""Allows version selection to be extended beyond the original Node Semver semantics. So for example,Setting 'version' to \""25-29\"" can be paired with a metadata pattern of \""-jre\"" to select Guava 29.0-jre"",""example"":""-jre""},{""name"":""distribution"",""type"":""String"",""displayName"":""Distribution type"",""description"":""The distribution of Gradle to find. \""bin\"" includes Gradle binaries. \""all\"" includes Gradle binaries, source code, and documentation."",""valid"":[""bin"",""all""]}]","[{""name"":""org.openrewrite.gradle.table.GradleWrappersInUse"",""displayName"":""Gradle wrappers in use"",""instanceName"":""Gradle wrappers in use"",""description"":""Gradle wrappers in use."",""columns"":[{""name"":""version"",""type"":""String"",""displayName"":""Wrapper version"",""description"":""The version of the Gradle wrapper in use.""},{""name"":""distribution"",""type"":""String"",""displayName"":""Wrapper distribution"",""description"":""The distribution type of the Gradle wrapper in use.""}]}]"
+maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.search.FindDependencyHandler,Find Gradle `dependencies` blocks,Find the dependency handler containing any number of dependency definitions.,1,Search,Gradle,,
maven,org.openrewrite:rewrite-gradle,org.openrewrite.gradle.security.UseHttpsForRepositories,Use HTTPS for repositories,Use HTTPS for repository URLs.,1,Security,Gradle,,
diff --git a/rewrite-gradle/src/test/java/org/openrewrite/gradle/gradle9/UseMainClassPropertyForApplicationTest.java b/rewrite-gradle/src/test/java/org/openrewrite/gradle/gradle9/UseMainClassPropertyForApplicationTest.java
new file mode 100644
index 0000000000..fca7ebd55d
--- /dev/null
+++ b/rewrite-gradle/src/test/java/org/openrewrite/gradle/gradle9/UseMainClassPropertyForApplicationTest.java
@@ -0,0 +1,140 @@
+/*
+ * Copyright 2026 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.openrewrite.gradle.gradle9;
+
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.openrewrite.DocumentExample;
+import org.openrewrite.test.RecipeSpec;
+import org.openrewrite.test.RewriteTest;
+
+import static org.openrewrite.gradle.Assertions.buildGradle;
+import static org.openrewrite.gradle.Assertions.buildGradleKts;
+
+class UseMainClassPropertyForApplicationTest implements RewriteTest {
+
+ @Override
+ public void defaults(RecipeSpec spec) {
+ spec.recipe(new UseMainClassPropertyForApplication());
+ }
+
+ @DocumentExample
+ @Test
+ void mainClassNameInApplicationBlock() {
+ rewriteRun(
+ buildGradle(
+ """
+ plugins {
+ id 'application'
+ }
+
+ application {
+ mainClassName = "com.example.AppMain"
+ }
+ """,
+ """
+ plugins {
+ id 'application'
+ }
+
+ application {
+ mainClass = "com.example.AppMain"
+ }
+ """
+ )
+ );
+ }
+
+ @Test
+ void mainClassNameInApplicationBlockKotlinDsl() {
+ rewriteRun(
+ buildGradleKts(
+ """
+ plugins {
+ application
+ }
+
+ application {
+ mainClassName = "com.example.AppMain"
+ }
+ """,
+ """
+ plugins {
+ application
+ }
+
+ application {
+ mainClass = "com.example.AppMain"
+ }
+ """
+ )
+ );
+ }
+
+ @Nested
+ class NoChange {
+ @Test
+ void noChangeWhenAlreadyMigrated() {
+ rewriteRun(
+ buildGradle(
+ """
+ plugins {
+ id 'application'
+ }
+
+ application {
+ mainClass = "com.example.AppMain"
+ }
+ """
+ )
+ );
+ }
+
+ @Test
+ void noChangeWhenAlreadyMigratedKotlinDsl() {
+ rewriteRun(
+ buildGradleKts(
+ """
+ plugins {
+ application
+ }
+
+ application {
+ mainClass = "com.example.AppMain"
+ }
+ """
+ )
+ );
+ }
+
+ @Test
+ void noChangeOutsideApplicationBlock() {
+ rewriteRun(
+ buildGradle(
+ """
+ plugins {
+ id 'java'
+ }
+
+ ext {
+ mainClassName = "com.example.AppMain"
+ }
+ """
+ )
+ );
+ }
+ }
+}