This is an automated email from the ASF dual-hosted git repository. jamesfredley pushed a commit to branch upgrade/gradle-9.3.1 in repository https://gitbox.apache.org/repos/asf/grails-core.git
commit b8dfcfd5423776e0e59f1039f37afdc0c732beaf Author: James Fredley <[email protected]> AuthorDate: Fri Jan 30 10:22:52 2026 -0500 Upgrade grails-forge to Micronaut 4 - Upgrade Micronaut from 3.10.4 to 4.10.7 - Upgrade Groovy from 3.x to 4.0.30 - Upgrade Spock from 2.1-groovy-3.0 to 2.3-groovy-4.0 - Migrate javax.* to jakarta.* validation annotations - Update dependency coordinates from org.codehaus.groovy to org.apache.groovy - Update micronaut-bom to micronaut-platform - Add micronaut-validation-processor for annotation processing - Add micronaut-jackson-databind runtime dependency - Fix deprecated Gradle APIs (conventions -> extensions) - Add ByteBuddy for Spock mocking on Java 17+ - Add JUnit Platform launcher for Gradle 9 test execution - Remove shadow plugin (now provided by micronaut-application plugin) --- .../org/apache/grails/buildsrc/SbomPlugin.groovy | 1 + .../grails/forge/rocker/plugin/RockerPlugin.java | 14 +++++------ .../rocker/plugin/RockerSourceSetProperty.java | 27 ++++++++++++++++++++-- grails-forge/gradle.properties | 15 ++++++------ grails-forge/gradle/doc-config.gradle | 4 ++-- .../gradle/micronaut-openapi-config.gradle | 2 +- grails-forge/gradle/test-config.gradle | 10 +++++++- .../gradle/wrapper/gradle-wrapper.properties | 2 +- .../grails-forge-analytics-postgres/build.gradle | 2 +- .../analytics/postgres/AnalyticsController.java | 2 +- .../forge/analytics/postgres/Application.java | 2 +- grails-forge/grails-forge-api/build.gradle | 22 ++++++++++-------- .../forge/api/create/AbstractCreateController.java | 2 +- .../api/create/github/GitHubCreateController.java | 2 +- .../api/create/github/GitHubCreateOperation.java | 2 +- .../api/create/github/GitHubCreateService.java | 2 +- .../api/create/github/GitHubRedirectService.java | 2 +- .../forge/api/create/zip/ZipCreateController.java | 8 ++++--- .../forge/api/create/zip/ZipCreateOperation.java | 2 +- .../org/grails/forge/api/diff/DiffController.java | 6 ++--- .../org/grails/forge/api/diff/DiffOperations.java | 4 ++-- .../groovy/org/grails/forge/api/DiffClient.groovy | 4 ++-- grails-forge/grails-forge-cli/build.gradle | 16 ++++++------- grails-forge/grails-forge-core/build.gradle | 20 ++++++++-------- .../forge/client/github/oauth/AccessToken.java | 2 +- .../templates/gradleWrapperProperties.rocker.raw | 2 +- .../java/org/grails/forge/util/GitHubUtil.java | 2 +- grails-forge/grails-forge-web-netty/build.gradle | 2 +- grails-forge/test-core/build.gradle | 6 ++--- 29 files changed, 113 insertions(+), 74 deletions(-) diff --git a/build-logic/plugins/src/main/groovy/org/apache/grails/buildsrc/SbomPlugin.groovy b/build-logic/plugins/src/main/groovy/org/apache/grails/buildsrc/SbomPlugin.groovy index 6f3d7b9eea..9cd28f1dc6 100644 --- a/build-logic/plugins/src/main/groovy/org/apache/grails/buildsrc/SbomPlugin.groovy +++ b/build-logic/plugins/src/main/groovy/org/apache/grails/buildsrc/SbomPlugin.groovy @@ -91,6 +91,7 @@ class SbomPlugin implements Plugin<Project> { 'pkg:maven/org.jline/[email protected]?type=jar' : 'BSD-2-Clause', // maps incorrectly because of https://github.com/CycloneDX/cyclonedx-core-java/issues/205 'pkg:maven/org.liquibase.ext/[email protected]?type=jar': 'Apache-2.0', // maps incorrectly because of https://github.com/liquibase/liquibase/issues/2445 & the base pom does not define a license 'pkg:maven/com.oracle.coherence.ce/[email protected]?type=pom': 'UPL-1.0', // does not have map based on license id + 'pkg:maven/com.oracle.coherence.ce/[email protected]?type=pom': 'UPL-1.0', // does not have map based on license id 'pkg:maven/com.oracle.coherence.ce/[email protected]?type=pom': 'UPL-1.0', // does not have map based on license id 'pkg:maven/opensymphony/[email protected]?type=jar' : 'OpenSymphony', // custom license approved by legal LEGAL-707 'pkg:maven/org.jruby/[email protected]?type=jar' : 'BSD-3-Clause'// https://web.archive.org/web/20240822213507/http://www.jcraft.com/jzlib/LICENSE.txt shows it's a 3 clause diff --git a/grails-forge/buildSrc/src/main/java/org/grails/forge/rocker/plugin/RockerPlugin.java b/grails-forge/buildSrc/src/main/java/org/grails/forge/rocker/plugin/RockerPlugin.java index 7e02e9dc23..b519161c3d 100644 --- a/grails-forge/buildSrc/src/main/java/org/grails/forge/rocker/plugin/RockerPlugin.java +++ b/grails-forge/buildSrc/src/main/java/org/grails/forge/rocker/plugin/RockerPlugin.java @@ -21,9 +21,9 @@ package org.grails.forge.rocker.plugin; import org.gradle.api.Plugin; import org.gradle.api.Project; -import org.gradle.api.internal.plugins.DslObject; +import org.gradle.api.plugins.ExtensionAware; import org.gradle.api.plugins.JavaLibraryPlugin; -import org.gradle.api.plugins.JavaPluginConvention; +import org.gradle.api.plugins.JavaPluginExtension; import org.gradle.api.tasks.SourceSet; import org.gradle.api.tasks.SourceSetContainer; import org.gradle.api.tasks.TaskProvider; @@ -52,9 +52,9 @@ public class RockerPlugin implements Plugin<Project> { project.getLayout().getBuildDirectory().dir("classes") ); - // Create own source set extension - SourceSetContainer sourceSets = project.getConvention().getPlugin( - JavaPluginConvention.class).getSourceSets(); + // Create own source set extension using the modern JavaPluginExtension API + SourceSetContainer sourceSets = project.getExtensions() + .getByType(JavaPluginExtension.class).getSourceSets(); sourceSets.all(sourceSet -> processSourceSet(project, sourceSet, rockerConfig)); } @@ -62,10 +62,10 @@ public class RockerPlugin implements Plugin<Project> { private static void processSourceSet(Project project, SourceSet sourceSet, RockerConfiguration rockerConfig) { // for each source set we will: - // 1) Add a new 'rocker' property to the source set + // 1) Add a new 'rocker' extension to the source set RockerSourceSetProperty rockerProperty = new RockerSourceSetProperty(project); - new DslObject(sourceSet).getConvention().getPlugins().put( + ((ExtensionAware) sourceSet).getExtensions().add( "rocker", rockerProperty); // 2) Create a rocker task for this sourceSet following the gradle diff --git a/grails-forge/buildSrc/src/main/java/org/grails/forge/rocker/plugin/RockerSourceSetProperty.java b/grails-forge/buildSrc/src/main/java/org/grails/forge/rocker/plugin/RockerSourceSetProperty.java index ffcc0f7d49..5aef586e2b 100644 --- a/grails-forge/buildSrc/src/main/java/org/grails/forge/rocker/plugin/RockerSourceSetProperty.java +++ b/grails-forge/buildSrc/src/main/java/org/grails/forge/rocker/plugin/RockerSourceSetProperty.java @@ -23,7 +23,10 @@ import groovy.lang.Closure; import org.gradle.api.Action; import org.gradle.api.Project; import org.gradle.api.tasks.SourceSet; -import org.gradle.util.ConfigureUtil; +import org.gradle.util.internal.ClosureBackedAction; + +import java.io.File; +import java.util.Set; /** * The rocker property added to the {@link SourceSet}. @@ -45,7 +48,7 @@ public class RockerSourceSetProperty { } public RockerSourceSetProperty rocker(Closure<?> configureClosure) { - ConfigureUtil.configure(configureClosure, getRocker()); + new ClosureBackedAction<>(configureClosure).execute(getRocker()); return this; } @@ -54,4 +57,24 @@ public class RockerSourceSetProperty { configureAction.execute(getRocker()); return this; } + + // Delegate methods to TemplateDirectorySet for DSL compatibility + public RockerSourceSetProperty srcDir(Object srcDir) { + templateDirs.srcDir(srcDir); + return this; + } + + public RockerSourceSetProperty srcDirs(Object... srcDirs) { + templateDirs.srcDirs(srcDirs); + return this; + } + + public RockerSourceSetProperty setSrcDirs(Iterable<?> srcPaths) { + templateDirs.setSrcDirs(srcPaths); + return this; + } + + public Set<File> getSrcDirs() { + return templateDirs.getSrcDirs(); + } } diff --git a/grails-forge/gradle.properties b/grails-forge/gradle.properties index e0adeeda0b..1a6e469b32 100644 --- a/grails-forge/gradle.properties +++ b/grails-forge/gradle.properties @@ -23,27 +23,28 @@ title=Grails Application Forge projectDesc=Generates Grails applications -# for forge build process which is a micronaut 3.x.x app with picocli +# for forge build process which is a micronaut 4.x.x app with picocli grailsPublishGradleVersion=0.0.2 antVersion=1.10.15 antlr4Version=4.8-1!! asciidoctorGradleJvmVersion=4.0.4 cglibVersion=3.3.0 +byteBuddyVersion=1.15.11 commonsCompressVersion=1.27.1 gradleSdkvendorPluginVersion=3.0.0 -groovyVersion=3.0.25 +groovyVersion=4.0.30 jacksonDatabindVersion=2.18.3 -jakartaInjectVersion=1.0.5 +jakartaInjectVersion=2.0.1 # match the jansi version in grails-bom jansiVersion=1.18 javaDiffUtils=4.15 jgitVersion=6.10.0.202406032230-r logbackClassicVersion=1.5.17 -micronautApplicationPluginVersion=3.7.10 -micronautBuildVersion=1.1.5 +micronautApplicationPluginVersion=4.5.3 +micronautBuildVersion=2.2.1 micronautDocsVersion=2.0.0 micronautGradlePlugins=5.4.10 -micronautVersion=3.10.4 +micronautVersion=4.10.7 nexusPublishVersion=1.3.0 nohttpGradleVersion=0.0.11 objenesisVersion=3.4 @@ -55,7 +56,7 @@ rockerVersion=2.2.1 shadowVersion=8.3.6 slf4jVersion=2.0.17 snakeyamlVersion=2.4 -spockVersion=2.1-groovy-3.0 +spockVersion=2.3-groovy-4.0 spotlessVersion=6.25.0 testRetryVersion=1.6.2 typesafeConfigVersion=1.4.3 diff --git a/grails-forge/gradle/doc-config.gradle b/grails-forge/gradle/doc-config.gradle index d7b0eaf7fb..1c393c66f0 100644 --- a/grails-forge/gradle/doc-config.gradle +++ b/grails-forge/gradle/doc-config.gradle @@ -28,8 +28,8 @@ configurations.register('documentation') { } dependencies { - documentation "org.codehaus.groovy:groovy-templates:$groovyVersion" - documentation "org.codehaus.groovy:groovy-dateutil:$groovyVersion" + documentation "org.apache.groovy:groovy-templates:$groovyVersion" + documentation "org.apache.groovy:groovy-dateutil:$groovyVersion" } tasks.withType(Groovydoc).configureEach { diff --git a/grails-forge/gradle/micronaut-openapi-config.gradle b/grails-forge/gradle/micronaut-openapi-config.gradle index c71afdfa2b..8fc0c93b0b 100644 --- a/grails-forge/gradle/micronaut-openapi-config.gradle +++ b/grails-forge/gradle/micronaut-openapi-config.gradle @@ -21,7 +21,7 @@ import groovy.transform.CompileStatic def openApiOutputFile = layout.buildDirectory.file('generated/openapi/openapi.properties') def openApiPropertiesTask = tasks.register('openApiProperties', WriteProperties) openApiPropertiesTask.configure { WriteProperties it -> - it.outputFile(openApiOutputFile.get().asFile) + it.destinationFile.set(openApiOutputFile) it.properties( 'swagger-ui.enabled': true, 'redoc.enabled': true, diff --git a/grails-forge/gradle/test-config.gradle b/grails-forge/gradle/test-config.gradle index 2f840abf40..71714cd08a 100644 --- a/grails-forge/gradle/test-config.gradle +++ b/grails-forge/gradle/test-config.gradle @@ -17,6 +17,13 @@ * under the License. */ +// Add JUnit Platform launcher dependency required by Gradle 9 for running tests +// Also add ByteBuddy for Spock mocking on Java 17+ (CGLIB doesn't support Java 17 class files) +dependencies { + testRuntimeOnly 'org.junit.platform:junit-platform-launcher' + testImplementation "net.bytebuddy:byte-buddy:$byteBuddyVersion" +} + tasks.withType(Test).configureEach { onlyIf { 