From 2497149e5f32be8dc4281708ee306bae6f2e22a2 Mon Sep 17 00:00:00 2001 From: Jacob Repp Date: Sat, 29 Nov 2025 16:09:52 -0800 Subject: [PATCH 1/4] Add Java 25 and Gradle 9.x compatibility Build fixes: - Update Gradle wrapper to 9.2.1 for Java 25 class file support - Add groovy-xml and groovy-swing dependencies for build-logic scripts - Fix Groovy 4.x imports (groovy.xml.XmlSlurper, groovy.xml.slurpersupport.GPathResult) - Fix Gradle 9.x task type API change in DistributionExtension - Add XmlParser import to idea.gradle for Gradle 9.x compatibility - Exclude .interp/.tokens files from groovydoc to avoid duplicates - Disable root project groovydoc due to antlr4 duplicate source issue --- build-logic/build.gradle | 4 ++++ .../main/groovy/org.apache.groovy-documented.gradle | 3 +++ .../apache/groovy/gradle/CheckstyleHtmlReport.groovy | 3 ++- .../apache/groovy/gradle/DistributionExtension.groovy | 2 +- build.gradle | 11 +++++++++++ gradle/idea.gradle | 2 ++ gradle/wrapper/gradle-wrapper.properties | 2 +- 7 files changed, 24 insertions(+), 3 deletions(-) diff --git a/build-logic/build.gradle b/build-logic/build.gradle index 6048edb7454..f1079a9369a 100644 --- a/build-logic/build.gradle +++ b/build-logic/build.gradle @@ -33,6 +33,10 @@ dependencies { implementation 'org.nosphere.apache:creadur-rat-gradle:0.8.1' implementation 'com.github.spotbugs.snom:spotbugs-gradle-plugin:6.0.5' implementation 'me.champeau.jmh:jmh-gradle-plugin:0.7.2' + // Required for CheckstyleHtmlReport.groovy - GPathResult + implementation 'org.apache.groovy:groovy-xml:4.0.28' + // Required for org.apache.groovy-published-library.gradle - SwingBuilder + implementation 'org.apache.groovy:groovy-swing:4.0.28' } tasks.withType(Jar).configureEach { diff --git a/build-logic/src/main/groovy/org.apache.groovy-documented.gradle b/build-logic/src/main/groovy/org.apache.groovy-documented.gradle index b2e0d5967bb..1cfc876b377 100644 --- a/build-logic/src/main/groovy/org.apache.groovy-documented.gradle +++ b/build-logic/src/main/groovy/org.apache.groovy-documented.gradle @@ -71,6 +71,9 @@ tasks.withType(Groovydoc).configureEach { source = sourceSets.main.allSource } groovyClasspath = configurations.groovydocClasspath + // Exclude duplicate .interp and .tokens files from antlr4 grammar generation + exclude '**/*.interp' + exclude '**/*.tokens' use = true windowTitle = "Groovy ${versions.groovy}" docTitle = "Groovy ${versions.groovy}" diff --git a/build-logic/src/main/groovy/org/apache/groovy/gradle/CheckstyleHtmlReport.groovy b/build-logic/src/main/groovy/org/apache/groovy/gradle/CheckstyleHtmlReport.groovy index d0712fff47d..39b22480814 100644 --- a/build-logic/src/main/groovy/org/apache/groovy/gradle/CheckstyleHtmlReport.groovy +++ b/build-logic/src/main/groovy/org/apache/groovy/gradle/CheckstyleHtmlReport.groovy @@ -22,7 +22,8 @@ import groovy.text.markup.MarkupTemplateEngine import groovy.text.markup.TemplateConfiguration import groovy.transform.CompileDynamic import groovy.transform.CompileStatic -import groovy.util.slurpersupport.GPathResult +import groovy.xml.XmlSlurper +import groovy.xml.slurpersupport.GPathResult import org.gradle.api.DefaultTask import org.gradle.api.file.ConfigurableFileCollection import org.gradle.api.file.RegularFileProperty diff --git a/build-logic/src/main/groovy/org/apache/groovy/gradle/DistributionExtension.groovy b/build-logic/src/main/groovy/org/apache/groovy/gradle/DistributionExtension.groovy index 3e2794d64a8..c02c4b5d668 100644 --- a/build-logic/src/main/groovy/org/apache/groovy/gradle/DistributionExtension.groovy +++ b/build-logic/src/main/groovy/org/apache/groovy/gradle/DistributionExtension.groovy @@ -43,7 +43,7 @@ class DistributionExtension { } DistributionExtension docs(String p, String... classNames) { - project.tasks.named('docGDK').configure { DocGDK docgen -> + project.tasks.named('docGDK', DocGDK).configure { docgen -> docgeneratorClasses.set(docgeneratorClasses.get() + classNames.collect { className -> def src = project.project(p).layout.projectDirectory.file( diff --git a/build.gradle b/build.gradle index 32abfcfd014..4a267058292 100644 --- a/build.gradle +++ b/build.gradle @@ -228,6 +228,17 @@ tasks.named('test') { dependsOn testExtensionModuleJar } +// Disable groovydoc for root project - duplicate source issue with Gradle 9.x +// The antlr4 generated sources and main sources have duplicate files +tasks.named('groovydoc', Groovydoc) { + enabled = false +} + +// Create empty groovydocJar since publication expects it +tasks.named('groovydocJar', Jar) { + enabled = false +} + clean.doFirst { delete "${rootDir}/buildSrc" } diff --git a/gradle/idea.gradle b/gradle/idea.gradle index ddd024d5e92..21d7510d73a 100644 --- a/gradle/idea.gradle +++ b/gradle/idea.gradle @@ -17,6 +17,8 @@ * under the License. */ +import groovy.xml.XmlParser + def appendNode(node, text) { node.append(new XmlParser().parseText(text)) } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index ff23a68d70f..23449a2b543 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME From 3a26e64001a7f36ed73978282810c8019378aeb3 Mon Sep 17 00:00:00 2001 From: Jacob Repp Date: Sat, 29 Nov 2025 20:14:33 -0800 Subject: [PATCH 2/4] Remove groovy-xml/groovy-swing deps, use console-only for signing prompts - groovy-xml already included in Gradle 9.2.1 - Replace SwingBuilder GUI with console-only fallback for signing credentials --- build-logic/build.gradle | 4 --- ...org.apache.groovy-published-library.gradle | 27 ++----------------- 2 files changed, 2 insertions(+), 29 deletions(-) diff --git a/build-logic/build.gradle b/build-logic/build.gradle index f1079a9369a..6048edb7454 100644 --- a/build-logic/build.gradle +++ b/build-logic/build.gradle @@ -33,10 +33,6 @@ dependencies { implementation 'org.nosphere.apache:creadur-rat-gradle:0.8.1' implementation 'com.github.spotbugs.snom:spotbugs-gradle-plugin:6.0.5' implementation 'me.champeau.jmh:jmh-gradle-plugin:0.7.2' - // Required for CheckstyleHtmlReport.groovy - GPathResult - implementation 'org.apache.groovy:groovy-xml:4.0.28' - // Required for org.apache.groovy-published-library.gradle - SwingBuilder - implementation 'org.apache.groovy:groovy-swing:4.0.28' } tasks.withType(Jar).configureEach { diff --git a/build-logic/src/main/groovy/org.apache.groovy-published-library.gradle b/build-logic/src/main/groovy/org.apache.groovy-published-library.gradle index 7d79e2d84b5..acf020d854e 100644 --- a/build-logic/src/main/groovy/org.apache.groovy-published-library.gradle +++ b/build-logic/src/main/groovy/org.apache.groovy-published-library.gradle @@ -1,5 +1,3 @@ -import groovy.swing.SwingBuilder - plugins { id 'maven-publish' id 'signing' @@ -826,31 +824,10 @@ gradle.taskGraph.whenReady { taskGraph -> } def promptUser(String prompt) { - def response = '' if (System.console() == null) { - new SwingBuilder().edt { - dialog(modal: true, // pause build - title: 'Response required', // dialog title - alwaysOnTop: true, - resizable: false, - locationRelativeTo: null, // centered on screen - pack: true, - show: true - ) { - vbox { - label(text: "$prompt:") - input = passwordField() - button(defaultButton: true, text: 'OK', actionPerformed: { - response = new String(input.password) - dispose() - }) - } - } - } - } else { - response = new String(System.console().readPassword("\n$prompt: ")) + throw new InvalidUserDataException("No console available. Please provide signing credentials via gradle.properties or environment variables.") } - + def response = new String(System.console().readPassword("\n$prompt: ")) if (!response) { throw new InvalidUserDataException("Null response detected!") } From 7f26ce80eb4677dfaf36357ebac85f8770ba2905 Mon Sep 17 00:00:00 2001 From: Jacob Repp Date: Sat, 29 Nov 2025 20:15:40 -0800 Subject: [PATCH 3/4] Add Java toolchain support for cross-JDK testing - Add foojay-resolver-convention plugin for auto-provisioning JDKs - Support testJavaVersion property to select toolchain JDK for tests - Maintains backward compatibility with target.java.home property --- .../src/main/groovy/org.apache.groovy-tested.gradle | 8 ++++++++ settings.gradle | 2 ++ 2 files changed, 10 insertions(+) diff --git a/build-logic/src/main/groovy/org.apache.groovy-tested.gradle b/build-logic/src/main/groovy/org.apache.groovy-tested.gradle index c6195735127..1d25b937980 100644 --- a/build-logic/src/main/groovy/org.apache.groovy-tested.gradle +++ b/build-logic/src/main/groovy/org.apache.groovy-tested.gradle @@ -54,6 +54,7 @@ tasks.withType(Test).configureEach { 'gradle.home': gradle.gradleHomeDir, // this is needed by the security.policy 'user.home': temporaryDir.absolutePath // make sure tests are isolated from real user home or tests using Grape may fail + // Support both legacy target.java.home and new toolchain-based approach if (rootProject.hasProperty('target.java.home')) { String targetJavaHome = rootProject.property('target.java.home')?.trim() if (targetJavaHome) { @@ -61,6 +62,13 @@ tasks.withType(Test).configureEach { if (Os.isFamily(Os.FAMILY_WINDOWS)) executable += '.exe' println "Using ${executable} to run tests" } + } else if (rootProject.hasProperty('testJavaVersion')) { + // Use Gradle toolchain for test execution + def testVersion = rootProject.property('testJavaVersion') as int + javaLauncher = javaToolchains.launcherFor { + languageVersion = JavaLanguageVersion.of(testVersion) + } + println "Using Java toolchain version ${testVersion} to run tests" } forkEvery = 50 diff --git a/settings.gradle b/settings.gradle index 5149f2ee417..b46f4ddf7ee 100644 --- a/settings.gradle +++ b/settings.gradle @@ -33,6 +33,8 @@ plugins { // Before updating this, please check the compatibility from https://docs.gradle.com/develocity/compatibility/#develocity_compatibility and https://develocity.apache.org/scans. id "com.gradle.develocity" version "3.19.2" id 'com.gradle.common-custom-user-data-gradle-plugin' version '2.1' + // Enable toolchain auto-provisioning for testing on multiple JDK versions + id 'org.gradle.toolchains.foojay-resolver-convention' version '0.9.0' } apply from: 'gradle/build-scans.gradle' From 82358f76924a400d4e094e4454f22fdb78977c67 Mon Sep 17 00:00:00 2001 From: Jacob Repp Date: Sat, 29 Nov 2025 20:16:03 -0800 Subject: [PATCH 4/4] Update CI workflow to use Java toolchains - Run Gradle with JDK 21 (required for Gradle 9.x) - Use testJavaVersion property with foojay toolchain resolver - Tests run on JDKs 8-25 via auto-provisioned toolchains --- .github/workflows/groovy-build-test.yml | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/.github/workflows/groovy-build-test.yml b/.github/workflows/groovy-build-test.yml index fb7d169ae55..859e46ef83e 100644 --- a/.github/workflows/groovy-build-test.yml +++ b/.github/workflows/groovy-build-test.yml @@ -35,13 +35,11 @@ jobs: - uses: actions/setup-java@v4 with: distribution: 'zulu' - java-version: | - ${{ matrix.java }} - 17 + java-version: '21' check-latest: true - uses: gradle/actions/setup-gradle@v4 - name: Test with Gradle - run: ./gradlew test -Ptarget.java.home="$JAVA_HOME_${{ matrix.java }}_X64" + run: ./gradlew test -PtestJavaVersion=${{ matrix.java }} timeout-minutes: 60 - name: Upload reports uses: actions/upload-artifact@v4 @@ -61,11 +59,9 @@ jobs: - uses: actions/setup-java@v4 with: distribution: 'zulu' - java-version: | - ${{ matrix.java }} - 17 + java-version: '21' check-latest: true - uses: gradle/actions/setup-gradle@v4 - name: Test with Gradle - run: ./gradlew test -Ptarget.java.home="$JAVA_HOME_${{ matrix.java }}_X64" + run: ./gradlew test -PtestJavaVersion=${{ matrix.java }} timeout-minutes: 60