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 {
         ![
@@ -34,7 +41,8 @@ tasks.withType(Test).configureEach {
     }
 
     environment('GRAILS_REPO_URL', 
uri(rootProject.layout.projectDirectory.dir('../build/local-maven')))
-    jvmArgs('-Duser.country=US', '-Duser.language=en')
+    jvmArgs('-Duser.country=US', '-Duser.language=en',
+            '--add-opens', 'java.base/java.lang=ALL-UNNAMED')
     forkEvery = 100
     maxParallelForks = Runtime.runtime.availableProcessors().intdiv(2) ?: 1
     maxHeapSize = '2G'
diff --git a/grails-forge/gradle/wrapper/gradle-wrapper.properties 
b/grails-forge/gradle/wrapper/gradle-wrapper.properties
index 7712f940a2..5012f38a99 100644
--- a/grails-forge/gradle/wrapper/gradle-wrapper.properties
+++ b/grails-forge/gradle/wrapper/gradle-wrapper.properties
@@ -2,7 +2,7 @@
 # and 
grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/templates/gradleWrapperProperties.rocker.raw
 distributionBase=GRADLE_USER_HOME
 distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.4-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.1-bin.zip
 networkTimeout=10000
 validateDistributionUrl=true
 zipStoreBase=GRADLE_USER_HOME
diff --git a/grails-forge/grails-forge-analytics-postgres/build.gradle 
b/grails-forge/grails-forge-analytics-postgres/build.gradle
index be824be68b..14864feb0b 100644
--- a/grails-forge/grails-forge-analytics-postgres/build.gradle
+++ b/grails-forge/grails-forge-analytics-postgres/build.gradle
@@ -18,7 +18,6 @@
  */
 
 plugins {
-    id 'com.gradleup.shadow'
     id 'org.apache.grails.buildsrc.properties'
     id 'io.micronaut.application' version "$micronautApplicationPluginVersion"
 }
@@ -39,6 +38,7 @@ dependencies {
     implementation "org.postgresql:postgresql:$postgresqlVersion"
 
     runtimeOnly "ch.qos.logback:logback-classic:$logbackClassicVersion"
+    runtimeOnly 'io.micronaut:micronaut-jackson-databind'
 
     testCompileOnly "io.micronaut:micronaut-inject-groovy:$micronautVersion"
 
diff --git 
a/grails-forge/grails-forge-analytics-postgres/src/main/java/org/grails/forge/analytics/postgres/AnalyticsController.java
 
b/grails-forge/grails-forge-analytics-postgres/src/main/java/org/grails/forge/analytics/postgres/AnalyticsController.java
index e34efc3f8d..14e02bf746 100644
--- 
a/grails-forge/grails-forge-analytics-postgres/src/main/java/org/grails/forge/analytics/postgres/AnalyticsController.java
+++ 
b/grails-forge/grails-forge-analytics-postgres/src/main/java/org/grails/forge/analytics/postgres/AnalyticsController.java
@@ -28,7 +28,7 @@ import io.micronaut.scheduling.TaskExecutors;
 import io.micronaut.scheduling.annotation.ExecuteOn;
 import org.grails.forge.analytics.Generated;
 
-import javax.transaction.Transactional;
+import jakarta.transaction.Transactional;
 import java.util.List;
 import java.util.stream.Collectors;
 
diff --git 
a/grails-forge/grails-forge-analytics-postgres/src/main/java/org/grails/forge/analytics/postgres/Application.java
 
b/grails-forge/grails-forge-analytics-postgres/src/main/java/org/grails/forge/analytics/postgres/Application.java
index a76606ff4c..d18d9d8b0a 100644
--- 
a/grails-forge/grails-forge-analytics-postgres/src/main/java/org/grails/forge/analytics/postgres/Application.java
+++ 
b/grails-forge/grails-forge-analytics-postgres/src/main/java/org/grails/forge/analytics/postgres/Application.java
@@ -27,7 +27,7 @@ import org.grails.forge.options.GormImpl;
 import org.grails.forge.options.JdkVersion;
 import org.grails.forge.options.TestFramework;
 
-import javax.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotBlank;
 import java.time.LocalDateTime;
 import java.util.Collections;
 import java.util.Objects;
diff --git a/grails-forge/grails-forge-api/build.gradle 
b/grails-forge/grails-forge-api/build.gradle
index 91fb090a05..3af4420ef5 100644
--- a/grails-forge/grails-forge-api/build.gradle
+++ b/grails-forge/grails-forge-api/build.gradle
@@ -28,17 +28,18 @@ version = projectVersion
 group = 'org.apache.grails.forge'
 
 dependencies {
-    annotationProcessor 
platform("io.micronaut:micronaut-bom:$micronautVersion")
-    implementation platform("io.micronaut:micronaut-bom:$micronautVersion")
+    annotationProcessor 
platform("io.micronaut.platform:micronaut-platform:$micronautVersion")
+    implementation 
platform("io.micronaut.platform:micronaut-platform:$micronautVersion")
     annotationProcessor 'io.micronaut:micronaut-inject-java'
-    testAnnotationProcessor 
platform("io.micronaut:micronaut-bom:$micronautVersion")
+    annotationProcessor 
'io.micronaut.validation:micronaut-validation-processor'
+    testAnnotationProcessor 
platform("io.micronaut.platform:micronaut-platform:$micronautVersion")
     testAnnotationProcessor 'io.micronaut:micronaut-inject-java'
 
     annotationProcessor 'com.google.code.findbugs:jsr305'
     annotationProcessor 
"io.micronaut.docs:micronaut-docs-asciidoc-config-props:$micronautDocsVersion"
     annotationProcessor 'io.micronaut.openapi:micronaut-openapi'
 
-    api platform("io.micronaut:micronaut-bom:$micronautVersion")
+    api platform("io.micronaut.platform:micronaut-platform:$micronautVersion")
 
     api project(':grails-forge-core'), {
         exclude group:'org.slf4j', module:'slf4j-nop'
@@ -47,8 +48,8 @@ dependencies {
     api 'io.micronaut:micronaut-http-client'
     api 'io.micronaut:micronaut-inject'
     api 'io.micronaut:micronaut-runtime'
-    api 'io.micronaut:micronaut-validation'
-    api group: 'javax.inject', name: 'javax.inject', version: '1'
+    api 'io.micronaut.validation:micronaut-validation'
+    api "jakarta.inject:jakarta.inject-api:$jakartaInjectVersion"
 
     implementation 'io.swagger.core.v3:swagger-annotations'
     implementation 'io.projectreactor:reactor-core'
@@ -57,6 +58,7 @@ dependencies {
     testImplementation 'io.micronaut:micronaut-http-client'
     testImplementation 'io.micronaut:micronaut-http-server-netty'
     testImplementation 'io.micronaut.test:micronaut-test-spock'
+    testRuntimeOnly 'io.micronaut:micronaut-jackson-databind'
 
     testCompileOnly "io.micronaut:micronaut-inject-groovy:$micronautVersion"
 
@@ -64,15 +66,15 @@ dependencies {
         testCompileOnly 
"io.micronaut:micronaut-inject-groovy:$micronautVersion"
     }
 
-    testImplementation "org.codehaus.groovy:groovy:$groovyVersion"
+    testImplementation "org.apache.groovy:groovy:$groovyVersion"
     testImplementation "org.spockframework:spock-core:$spockVersion", {
-        exclude group: 'org.codehaus.groovy', module: 'groovy-all'
+        exclude group: 'org.apache.groovy', module: 'groovy-all'
     }
 
     testImplementation "cglib:cglib-nodep:$cglibVersion"
     testImplementation "org.objenesis:objenesis:$objenesisVersion"
     testRuntimeOnly "ch.qos.logback:logback-classic:$logbackClassicVersion"
-    testImplementation "org.codehaus.groovy:groovy-test:$groovyVersion"
+    testImplementation "org.apache.groovy:groovy-test:$groovyVersion"
 }
 
 apply {
@@ -85,7 +87,7 @@ apply {
 configurations.configureEach {
     resolutionStrategy {
         eachDependency { DependencyResolveDetails details ->
-            if (details.requested.group == 'org.codehaus.groovy') {
+            if (details.requested.group == 'org.apache.groovy') {
                 details.useVersion(groovyVersion)
             }
             if (details.requested.name == 'spock-core') {
diff --git 
a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/AbstractCreateController.java
 
b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/AbstractCreateController.java
index d91c31b33a..07c6faa2ef 100644
--- 
a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/AbstractCreateController.java
+++ 
b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/AbstractCreateController.java
@@ -38,7 +38,7 @@ import org.grails.forge.util.NameUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import javax.validation.constraints.Pattern;
+import jakarta.validation.constraints.Pattern;
 import java.util.Collections;
 import java.util.List;
 
diff --git 
a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/github/GitHubCreateController.java
 
b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/github/GitHubCreateController.java
index 2fa9bcae1b..94820ac159 100644
--- 
a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/github/GitHubCreateController.java
+++ 
b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/github/GitHubCreateController.java
@@ -46,7 +46,7 @@ import org.grails.forge.options.ServletImpl;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import javax.validation.constraints.Pattern;
+import jakarta.validation.constraints.Pattern;
 import java.net.URI;
 import java.util.List;
 
diff --git 
a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/github/GitHubCreateOperation.java
 
b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/github/GitHubCreateOperation.java
index 845439c272..c836b61f65 100644
--- 
a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/github/GitHubCreateOperation.java
+++ 
b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/github/GitHubCreateOperation.java
@@ -31,7 +31,7 @@ import org.grails.forge.options.GormImpl;
 import org.grails.forge.options.JdkVersion;
 import org.grails.forge.options.ServletImpl;
 
-import javax.validation.constraints.Pattern;
+import jakarta.validation.constraints.Pattern;
 import java.util.List;
 
 /**
diff --git 
a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/github/GitHubCreateService.java
 
b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/github/GitHubCreateService.java
index a013fae7f0..1b415cba2f 100644
--- 
a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/github/GitHubCreateService.java
+++ 
b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/github/GitHubCreateService.java
@@ -46,7 +46,7 @@ import org.grails.forge.util.GitHubUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
 import java.io.File;
 import java.io.IOException;
 import java.nio.file.Files;
diff --git 
a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/github/GitHubRedirectService.java
 
b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/github/GitHubRedirectService.java
index d8c2fa4f1e..388f220e3c 100644
--- 
a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/github/GitHubRedirectService.java
+++ 
b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/github/GitHubRedirectService.java
@@ -29,7 +29,7 @@ import jakarta.inject.Singleton;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
 import java.net.URI;
 import java.util.UUID;
 
diff --git 
a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/zip/ZipCreateController.java
 
b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/zip/ZipCreateController.java
index 74849ffea4..bcf7fb2061 100644
--- 
a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/zip/ZipCreateController.java
+++ 
b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/zip/ZipCreateController.java
@@ -47,9 +47,10 @@ import org.grails.forge.options.ServletImpl;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Pattern;
+import io.micronaut.validation.Validated;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Pattern;
 import java.io.IOException;
 import java.io.OutputStream;
 import java.io.Writer;
@@ -64,6 +65,7 @@ import java.util.List;
  */
 @Controller
 @ExecuteOn(TaskExecutors.IO)
+@Validated
 public class ZipCreateController extends AbstractCreateController implements 
ZipCreateOperation {
 
     public static final String MEDIA_TYPE_APPLICATION_ZIP = "application/zip";
diff --git 
a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/zip/ZipCreateOperation.java
 
b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/zip/ZipCreateOperation.java
index 43dcf1131f..8e23a4e39b 100644
--- 
a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/zip/ZipCreateOperation.java
+++ 
b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/zip/ZipCreateOperation.java
@@ -30,7 +30,7 @@ import org.grails.forge.options.GormImpl;
 import org.grails.forge.options.ServletImpl;
 import org.grails.forge.options.JdkVersion;
 
-import javax.validation.constraints.Pattern;
+import jakarta.validation.constraints.Pattern;
 import java.util.List;
 
 /**
diff --git 
a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/diff/DiffController.java
 
b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/diff/DiffController.java
index 62f9c9c9e4..21258a5000 100644
--- 
a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/diff/DiffController.java
+++ 
b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/diff/DiffController.java
@@ -41,9 +41,9 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse;
 import org.reactivestreams.Publisher;
 import reactor.core.publisher.Flux;
 
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Pattern;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Pattern;
 import java.io.IOException;
 import java.util.Collections;
 import java.util.List;
diff --git 
a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/diff/DiffOperations.java
 
b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/diff/DiffOperations.java
index 6249b23f45..d72a6031a6 100644
--- 
a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/diff/DiffOperations.java
+++ 
b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/diff/DiffOperations.java
@@ -26,8 +26,8 @@ import org.grails.forge.options.*;
 import io.swagger.v3.oas.annotations.Parameter;
 import org.reactivestreams.Publisher;
 
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
 import java.io.IOException;
 import java.util.List;
 
diff --git 
a/grails-forge/grails-forge-api/src/test/groovy/org/grails/forge/api/DiffClient.groovy
 
b/grails-forge/grails-forge-api/src/test/groovy/org/grails/forge/api/DiffClient.groovy
index 278c6259b5..29dfa9c7f1 100644
--- 
a/grails-forge/grails-forge-api/src/test/groovy/org/grails/forge/api/DiffClient.groovy
+++ 
b/grails-forge/grails-forge-api/src/test/groovy/org/grails/forge/api/DiffClient.groovy
@@ -29,8 +29,8 @@ import org.grails.forge.options.BuildTool
 import org.grails.forge.options.JdkVersion
 import org.grails.forge.options.Language
 
-import javax.validation.constraints.NotBlank
-import javax.validation.constraints.NotNull
+import jakarta.validation.constraints.NotBlank
+import jakarta.validation.constraints.NotNull
 
 @Client('/diff')
 interface DiffClient {
diff --git a/grails-forge/grails-forge-cli/build.gradle 
b/grails-forge/grails-forge-cli/build.gradle
index b44a145b51..48d11c0cf3 100644
--- a/grails-forge/grails-forge-cli/build.gradle
+++ b/grails-forge/grails-forge-cli/build.gradle
@@ -68,10 +68,10 @@ ext {
 }
 
 dependencies {
-    annotationProcessor 
platform("io.micronaut:micronaut-bom:$micronautVersion")
-    implementation platform("io.micronaut:micronaut-bom:$micronautVersion")
+    annotationProcessor 
platform("io.micronaut.platform:micronaut-platform:$micronautVersion")
+    implementation 
platform("io.micronaut.platform:micronaut-platform:$micronautVersion")
     annotationProcessor 'io.micronaut:micronaut-inject-java'
-    testAnnotationProcessor 
platform("io.micronaut:micronaut-bom:$micronautVersion")
+    testAnnotationProcessor 
platform("io.micronaut.platform:micronaut-platform:$micronautVersion")
     testAnnotationProcessor 'io.micronaut:micronaut-inject-java'
 
     generateConfig "info.picocli:picocli-codegen:$picocliVersion"
@@ -84,7 +84,7 @@ dependencies {
         exclude group: 'org.apache.grails', module: 'grails-bom'
         exclude group: 'org.apache.groovy'
     }
-    compileOnly 'org.codehaus.groovy:groovy'
+    compileOnly 'org.apache.groovy:groovy'
     implementation "com.fizzed:rocker-runtime:$rockerVersion"
     implementation "info.picocli:picocli:$picocliVersion"
     implementation "info.picocli:picocli-shell-jline3:$picocliVersion"
@@ -102,15 +102,15 @@ dependencies {
         testCompileOnly 
"io.micronaut:micronaut-inject-groovy:$micronautVersion"
     }
 
-    testImplementation "org.codehaus.groovy:groovy:$groovyVersion"
+    testImplementation "org.apache.groovy:groovy:$groovyVersion"
     testImplementation "org.spockframework:spock-core:$spockVersion", {
-        exclude group: 'org.codehaus.groovy', module: 'groovy-all'
+        exclude group: 'org.apache.groovy', module: 'groovy-all'
     }
 
     testImplementation "cglib:cglib-nodep:$cglibVersion"
     testImplementation "org.objenesis:objenesis:$objenesisVersion"
     testRuntimeOnly "ch.qos.logback:logback-classic:$logbackClassicVersion"
-    testImplementation "org.codehaus.groovy:groovy-test:$groovyVersion"
+    testImplementation "org.apache.groovy:groovy-test:$groovyVersion"
 }
 
 rocker {
@@ -162,7 +162,7 @@ jarTask.configure { Jar it ->
 configurations.configureEach {
     resolutionStrategy {
         eachDependency { DependencyResolveDetails details ->
-            if (details.requested.group == 'org.codehaus.groovy') {
+            if (details.requested.group == 'org.apache.groovy') {
                 details.useVersion(groovyVersion)
             }
             if (details.requested.name == 'spock-core') {
diff --git a/grails-forge/grails-forge-core/build.gradle 
b/grails-forge/grails-forge-core/build.gradle
index 84a50c8cca..dcd03b7893 100644
--- a/grails-forge/grails-forge-core/build.gradle
+++ b/grails-forge/grails-forge-core/build.gradle
@@ -41,13 +41,15 @@ sourceSets {
 }
 
 dependencies {
-    annotationProcessor 
platform("io.micronaut:micronaut-bom:$micronautVersion")
-    implementation platform("io.micronaut:micronaut-bom:$micronautVersion")
+    annotationProcessor 
platform("io.micronaut.platform:micronaut-platform:$micronautVersion")
+    implementation 
platform("io.micronaut.platform:micronaut-platform:$micronautVersion")
     annotationProcessor 'io.micronaut:micronaut-inject-java'
-    testAnnotationProcessor 
platform("io.micronaut:micronaut-bom:$micronautVersion")
+    testAnnotationProcessor 
platform("io.micronaut.platform:micronaut-platform:$micronautVersion")
     testAnnotationProcessor 'io.micronaut:micronaut-inject-java'
 
-    api platform("io.micronaut:micronaut-bom:$micronautVersion") // TODO: 
Should this be api?
+    api platform("io.micronaut.platform:micronaut-platform:$micronautVersion") 
// TODO: Should this be api?
+    api "com.fasterxml.jackson.core:jackson-databind:$jacksonDatabindVersion"
+    api 'jakarta.validation:jakarta.validation-api'
     api "com.fizzed:rocker-runtime:$rockerVersion"
     api "io.github.java-diff-utils:java-diff-utils:$javaDiffUtils"
     api 'io.micronaut:micronaut-http'
@@ -61,21 +63,21 @@ dependencies {
 
     compileOnly 'com.google.code.findbugs:jsr305'
 
-    testImplementation 'org.codehaus.groovy:groovy-yaml'
+    testImplementation 'org.apache.groovy:groovy-yaml'
 
     if (project.hasProperty('micronautVersion')) {
         testCompileOnly 
"io.micronaut:micronaut-inject-groovy:$micronautVersion"
     }
 
-    testImplementation "org.codehaus.groovy:groovy:$groovyVersion"
+    testImplementation "org.apache.groovy:groovy:$groovyVersion"
     testImplementation "org.spockframework:spock-core:$spockVersion", {
-        exclude group: 'org.codehaus.groovy', module: 'groovy-all'
+        exclude group: 'org.apache.groovy', module: 'groovy-all'
     }
 
     testImplementation "cglib:cglib-nodep:$cglibVersion"
     testImplementation "org.objenesis:objenesis:$objenesisVersion"
     testRuntimeOnly "ch.qos.logback:logback-classic:$logbackClassicVersion"
-    testImplementation "org.codehaus.groovy:groovy-test:$groovyVersion"
+    testImplementation "org.apache.groovy:groovy-test:$groovyVersion"
 }
 
 
@@ -136,7 +138,7 @@ nohttp {
 configurations.configureEach {
     resolutionStrategy {
         eachDependency { DependencyResolveDetails details ->
-            if (details.requested.group == 'org.codehaus.groovy') {
+            if (details.requested.group == 'org.apache.groovy') {
                 details.useVersion(groovyVersion)
             }
             if (details.requested.name == 'spock-core') {
diff --git 
a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/client/github/oauth/AccessToken.java
 
b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/client/github/oauth/AccessToken.java
index 704b31278a..16e549a42f 100644
--- 
a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/client/github/oauth/AccessToken.java
+++ 
b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/client/github/oauth/AccessToken.java
@@ -22,7 +22,7 @@ import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import io.micronaut.core.annotation.Introspected;
 
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author Pavol Gressa
diff --git 
a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/templates/gradleWrapperProperties.rocker.raw
 
b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/templates/gradleWrapperProperties.rocker.raw
index e5d545a479..bca7782442 100644
--- 
a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/templates/gradleWrapperProperties.rocker.raw
+++ 
b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/templates/gradleWrapperProperties.rocker.raw
@@ -34,7 +34,7 @@ Features features)
 @* Keep gradle version synced with .sdkmanrc, gradle.properties 
(gradleToolingApiVersion), all gradle-wrapper.properties files *@
 distributionBase=GRADLE_USER_HOME
 distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.4-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.1-bin.zip
 networkTimeout=10000
 validateDistributionUrl=true
 zipStoreBase=GRADLE_USER_HOME
diff --git 
a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/util/GitHubUtil.java
 
b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/util/GitHubUtil.java
index 24fca64eac..0df87f8038 100644
--- 
a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/util/GitHubUtil.java
+++ 
b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/util/GitHubUtil.java
@@ -27,7 +27,7 @@ import 
org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider;
 import org.grails.forge.client.github.v3.GitHubRepository;
 import org.grails.forge.client.github.v3.GitHubUser;
 
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
 import java.io.IOException;
 import java.nio.file.Path;
 import java.util.List;
diff --git a/grails-forge/grails-forge-web-netty/build.gradle 
b/grails-forge/grails-forge-web-netty/build.gradle
index f53150b74d..067765a4b9 100644
--- a/grails-forge/grails-forge-web-netty/build.gradle
+++ b/grails-forge/grails-forge-web-netty/build.gradle
@@ -18,7 +18,6 @@
  */
 
 plugins {
-    id 'com.gradleup.shadow'
     id 'org.apache.grails.buildsrc.properties'
     id 'io.micronaut.application' version "$micronautApplicationPluginVersion"
 }
@@ -32,6 +31,7 @@ dependencies {
     implementation 'io.micronaut.gcp:micronaut-gcp-http-client'
 
     runtimeOnly 'ch.qos.logback:logback-classic'
+    runtimeOnly 'io.micronaut:micronaut-jackson-databind'
 
     testImplementation 'io.micronaut:micronaut-http-client'
     testImplementation 'io.micronaut.test:micronaut-test-spock'
diff --git a/grails-forge/test-core/build.gradle 
b/grails-forge/test-core/build.gradle
index 4011685591..701646929f 100644
--- a/grails-forge/test-core/build.gradle
+++ b/grails-forge/test-core/build.gradle
@@ -59,15 +59,15 @@ dependencies {
         testCompileOnly 
"io.micronaut:micronaut-inject-groovy:$micronautVersion"
     }
 
-    testImplementation "org.codehaus.groovy:groovy:$groovyVersion"
+    testImplementation "org.apache.groovy:groovy:$groovyVersion"
     testImplementation "org.spockframework:spock-core:$spockVersion", {
-        exclude group: 'org.codehaus.groovy', module: 'groovy-all'
+        exclude group: 'org.apache.groovy', module: 'groovy-all'
     }
 
     testImplementation "cglib:cglib-nodep:$cglibVersion"
     testImplementation "org.objenesis:objenesis:$objenesisVersion"
     testRuntimeOnly "ch.qos.logback:logback-classic:$logbackClassicVersion"
-    testImplementation "org.codehaus.groovy:groovy-test:$groovyVersion"
+    testImplementation "org.apache.groovy:groovy-test:$groovyVersion"
 }
 
 apply {


Reply via email to