Skip to content
Open
Show file tree
Hide file tree
Changes from 3 commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
9fb6826
Upgrade to Gradle 9.3.1
jamesfredley Jan 30, 2026
b8dfcfd
Upgrade grails-forge to Micronaut 4
jamesfredley Jan 30, 2026
df9f655
Fix deprecated archives configuration usage
jamesfredley Jan 30, 2026
852effb
Upgrade asciidoctor-gradle-jvm to 4.0.5
jamesfredley Jan 30, 2026
80ee39c
Remove unused imports in ApplicationContextCommandTask
jamesfredley Jan 30, 2026
dce09db
Fix implicit dependency validation error in grails-doc
jamesfredley Jan 30, 2026
0460397
Merge branch '8.0.x' into upgrade/gradle-9.3.1
jamesfredley Jan 31, 2026
4ea8427
Update Develocity plugin to 4.3.2 and CCUD plugin to 2.4.0
jamesfredley Jan 31, 2026
7ce8d2b
Fix Task.project invocation at execution time deprecations
jamesfredley Jan 31, 2026
64541cd
Fix deprecated task syntax in gradle-sample test resources
jamesfredley Jan 31, 2026
1dae938
Update Gradle wrapper files to 9.3.1
jamesfredley Jan 31, 2026
3409dfd
Merge branch '8.0.x' into upgrade/gradle-9.3.1
jamesfredley Feb 1, 2026
1eeb45f
Merge branch '8.0.x' into upgrade/gradle-9.3.1
jamesfredley Feb 1, 2026
081028b
Merge remote-tracking branch 'origin/8.0.x' into upgrade/gradle-9.3.1
jamesfredley Feb 26, 2026
a0cd73a
Merge remote-tracking branch 'origin/8.0.x' into upgrade/gradle-9.3.1
jamesfredley Mar 20, 2026
66f6229
Upgrade to Gradle 9.4.1 and Micronaut Platform 4.10.10
jamesfredley Mar 20, 2026
5afdf6d
Merge branch '8.0.x' into upgrade/gradle-9.3.1
jamesfredley Mar 21, 2026
34c0f9d
Merge branch '8.0.x' into upgrade/gradle-9.3.1
jamesfredley Mar 21, 2026
b5a833a
fix: add @DisableCachingByDefault for Gradle 9 plugin validation
jamesfredley Mar 21, 2026
53a5312
Merge branch '8.0.x' into upgrade/gradle-9.3.1
jamesfredley Mar 21, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .sdkmanrc
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@
java=17.0.18-librca
# Keep gradle version synced with gradle.properties (gradleToolingApiVersion), all gradle-wrapper.properties files,
# and grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/templates/gradleWrapperProperties.rocker.raw
gradle=8.14.4
gradle=9.3.1

9 changes: 4 additions & 5 deletions build-logic/docs-core/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -38,10 +38,9 @@ apply {
dependencies {
gradleConf gradleApi()

// grails-docs classes are used in Gradle builds,
// so we must compile with Groovy 3 until Gradle upgrades to Groovy 4.
compileOnly "org.codehaus.groovy:groovy:${GroovySystem.version}"
compileOnly "org.codehaus.groovy:groovy-ant:${GroovySystem.version}"
// grails-docs classes are used in Gradle builds, using Gradle's embedded Groovy version
compileOnly "org.apache.groovy:groovy:${GroovySystem.version}"
compileOnly "org.apache.groovy:groovy-ant:${GroovySystem.version}"

api "org.apache.commons:commons-text:${gradleBomDependencyVersions['commons-text.version']}"
api "org.apache.ant:ant:${gradleBomDependencyVersions['ant.version']}"
Expand All @@ -56,7 +55,7 @@ dependencies {
transitive = false
}

testImplementation "org.codehaus.groovy:groovy-test-junit5:${GroovySystem.version}"
testImplementation "org.apache.groovy:groovy-test-junit5:${GroovySystem.version}"
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.12.2'
testImplementation 'org.junit.platform:junit-platform-runner:1.12.2'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.12.2'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
*/
package grails.doc.ant

import groovy.ant.AntBuilder
import org.apache.tools.ant.BuildException
import org.apache.tools.ant.Project
import org.apache.tools.ant.Task
Expand Down
2 changes: 1 addition & 1 deletion build-logic/gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,7 @@ class SbomPlugin implements Plugin<Project> {
'pkg:maven/org.jline/jline@3.23.0?type=jar' : 'BSD-2-Clause', // maps incorrectly because of https://github.com/CycloneDX/cyclonedx-core-java/issues/205
'pkg:maven/org.liquibase.ext/liquibase-hibernate5@4.27.0?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/coherence-bom@25.03.1?type=pom': 'UPL-1.0', // does not have map based on license id
'pkg:maven/com.oracle.coherence.ce/coherence-bom@25.03.2?type=pom': 'UPL-1.0', // does not have map based on license id
'pkg:maven/com.oracle.coherence.ce/coherence-bom@22.06.2?type=pom': 'UPL-1.0', // does not have map based on license id
'pkg:maven/opensymphony/sitemesh@2.6.0?type=jar' : 'OpenSymphony', // custom license approved by legal LEGAL-707
'pkg:maven/org.jruby/jzlib@1.1.5?type=jar' : 'BSD-3-Clause'// https://web.archive.org/web/20240822213507/http://www.jcraft.com/jzlib/LICENSE.txt shows it's a 3 clause
Expand Down
2 changes: 1 addition & 1 deletion dependencies.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ ext {
'byte-buddy.version' : '1.17.7',
'commons-text.version' : '1.13.1',
'directory-watcher.version' : '0.19.1',
'gradle-spock.version' : '2.3-groovy-3.0',
'gradle-spock.version' : '2.3-groovy-4.0',
'grails-publish-plugin.version' : '0.0.4',
'jansi.version' : '1.18',
'javaparser-core.version' : '3.27.0',
Expand Down
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ expectitCoreVersion=0.9.0
gparsVersion=1.2.1
# Keep gradle version synced with .sdkmanrc, all gradle-wrapper.properties files,
# and grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/templates/gradleWrapperProperties.rocker.raw
gradleToolingApiVersion=8.14.4
gradleToolingApiVersion=9.3.1
hibernate5Version=5.6.15.Final
javassistVersion=3.30.2-GA
jnrPosixVersion=3.1.20
Expand Down
2 changes: 1 addition & 1 deletion gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
6 changes: 5 additions & 1 deletion grails-data-hibernate5/docs/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,12 @@ ext {

configurations {
documentation {
canBeConsumed = false
canBeResolved = true
attributes {
attribute(Bundling.BUNDLING_ATTRIBUTE, (Bundling) (objects.named(Bundling, 'external')))
attribute(Category.CATEGORY_ATTRIBUTE, objects.named(Category, Category.LIBRARY))
attribute(Bundling.BUNDLING_ATTRIBUTE, objects.named(Bundling, Bundling.EXTERNAL))
attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage, Usage.JAVA_RUNTIME))
}
}
}
Expand Down
6 changes: 5 additions & 1 deletion grails-data-mongodb/docs/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,12 @@ ext {

configurations {
documentation {
canBeConsumed = false
canBeResolved = true
attributes {
attribute(Bundling.BUNDLING_ATTRIBUTE, (Bundling) (objects.named(Bundling, 'external')))
attribute(Category.CATEGORY_ATTRIBUTE, objects.named(Category, Category.LIBRARY))
attribute(Bundling.BUNDLING_ATTRIBUTE, objects.named(Bundling, Bundling.EXTERNAL))
attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage, Usage.JAVA_RUNTIME))
}
}
}
Expand Down
12 changes: 8 additions & 4 deletions grails-data-neo4j/docs/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -38,17 +38,21 @@ apply plugin: 'org.asciidoctor.jvm.convert'

configurations {
documentation {
canBeConsumed = false
canBeResolved = true
attributes {
attribute(Bundling.BUNDLING_ATTRIBUTE, (Bundling) (objects.named(Bundling, 'external')))
attribute(Category.CATEGORY_ATTRIBUTE, objects.named(Category, Category.LIBRARY))
attribute(Bundling.BUNDLING_ATTRIBUTE, objects.named(Bundling, Bundling.EXTERNAL))
attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage, Usage.JAVA_RUNTIME))
}
}
}

dependencies {
documentation "org.fusesource.jansi:jansi:$jansiVersion"
documentation "org.codehaus.groovy:groovy"
documentation "org.codehaus.groovy:groovy-templates"
documentation "org.codehaus.groovy:groovy-dateutil"
documentation "org.apache.groovy:groovy"
documentation "org.apache.groovy:groovy-templates"
documentation "org.apache.groovy:groovy-dateutil"
documentation "com.github.javaparser:javaparser-core:$javaParserCoreVersion"
for (p in coreProjects) {
documentation "org.apache.grails:grails-datastore-$p:$datastoreVersion"
Expand Down
5 changes: 3 additions & 2 deletions grails-doc/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -318,8 +318,9 @@ tasks.register('dist', Zip).configure { Zip it ->
it.from(outputDir)
}

artifacts {
archives dist
// Make dist a direct dependency of assemble instead of using deprecated archives configuration
tasks.named('assemble').configure {
dependsOn(tasks.named('dist'))
}

// the groovy plugin is applied to this project, but we do not build a jar file since
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,9 @@

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;
Expand Down Expand Up @@ -52,20 +52,20 @@ public void apply(Project 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));

}

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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,10 @@
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}.
Expand All @@ -45,7 +48,7 @@ public TemplateDirectorySet getRocker() {
}

public RockerSourceSetProperty rocker(Closure<?> configureClosure) {
ConfigureUtil.configure(configureClosure, getRocker());
new ClosureBackedAction<>(configureClosure).execute(getRocker());
return this;
}

Expand All @@ -54,4 +57,24 @@ public RockerSourceSetProperty rocker(
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();
}
}
15 changes: 8 additions & 7 deletions grails-forge/gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down
4 changes: 2 additions & 2 deletions grails-forge/gradle/doc-config.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
2 changes: 1 addition & 1 deletion grails-forge/gradle/micronaut-openapi-config.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
10 changes: 9 additions & 1 deletion grails-forge/gradle/test-config.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
![
Expand All @@ -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'
Expand Down
2 changes: 1 addition & 1 deletion grails-forge/gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
6 changes: 4 additions & 2 deletions grails-forge/grails-cli/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -124,8 +124,10 @@ shadowJarTask.configure { ShadowJar it ->
'about.html' // restatement of the Eclipse Distribution License - Version 1.0 for jakarta
)
}
// publish shadow jar separately from the regular library
artifacts { archives shadowJarTask }
// Make shadow jar a direct dependency of assemble instead of using deprecated archives configuration
tasks.named('assemble').configure {
dependsOn(shadowJarTask)
}

TaskProvider<CreateStartScripts> cliStartScripts = tasks.register('createCliStartScripts', CreateStartScripts)
cliStartScripts.configure { CreateStartScripts t ->
Expand Down
2 changes: 1 addition & 1 deletion grails-forge/grails-forge-analytics-postgres/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@
*/

plugins {
id 'com.gradleup.shadow'
id 'org.apache.grails.buildsrc.properties'
id 'io.micronaut.application' version "$micronautApplicationPluginVersion"
}
Expand All @@ -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"

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
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;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
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;
Expand Down
Loading
Loading