From a0a022cb286c530d704ee8ea246125a4c6d8e82b Mon Sep 17 00:00:00 2001 From: aIbrahiim Date: Wed, 29 Oct 2025 13:02:01 +0300 Subject: [PATCH 01/12] use both compilation and runtime to use Java 8 when testJavaVersion=8 --- .../org/apache/beam/gradle/BeamModulePlugin.groovy | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy b/buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy index 650cdd944d37..3227da9fdd10 100644 --- a/buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy +++ b/buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy @@ -1667,6 +1667,10 @@ class BeamModulePlugin implements Plugin { project.tasks.compileTestJava { setCompileAndRuntimeJavaVersion(options.compilerArgs, ver) project.ext.setJavaVerOptions(options, ver) + if (testJavaHome) { + options.fork = true + options.forkOptions.executable = "${testJavaHome}/bin/javac" + } if (ver == '25') { // TODO: Upgrade errorprone version to support Java25. Currently compile crashes // java.lang.NoSuchFieldError: Class com.sun.tools.javac.code.TypeTag does not have member field @@ -1679,6 +1683,13 @@ class BeamModulePlugin implements Plugin { useJUnit() executable = "${testJavaHome}/bin/java" } + project.afterEvaluate { + project.tasks.withType(Test).configureEach { testTask -> + if (testJavaHome) { + testTask.executable = "${testJavaHome}/bin/java" + } + } + } } if (configuration.shadowClosure) { From 7ddd1c2384c67b8ba29937556161d905bed41b43 Mon Sep 17 00:00:00 2001 From: aIbrahiim Date: Wed, 29 Oct 2025 13:50:39 +0300 Subject: [PATCH 02/12] Fix Java8 test failures --- .../groovy/org/apache/beam/gradle/BeamModulePlugin.groovy | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy b/buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy index 3227da9fdd10..4d8e05b7aaa7 100644 --- a/buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy +++ b/buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy @@ -1663,7 +1663,6 @@ class BeamModulePlugin implements Plugin { String ver = project.getProperty('testJavaVersion') def testJavaHome = project.getProperty("java${ver}Home") - // redirect java compiler to specified version for compileTestJava only project.tasks.compileTestJava { setCompileAndRuntimeJavaVersion(options.compilerArgs, ver) project.ext.setJavaVerOptions(options, ver) @@ -1677,17 +1676,19 @@ class BeamModulePlugin implements Plugin { // 'com.sun.tools.javac.code.TypeTag UNKNOWN' options.errorprone.enabled = false } + outputs.upToDateWhen { false } } - // redirect java runtime to specified version for running tests project.tasks.withType(Test).configureEach { useJUnit() executable = "${testJavaHome}/bin/java" + dependsOn project.tasks.compileTestJava } project.afterEvaluate { project.tasks.withType(Test).configureEach { testTask -> if (testJavaHome) { testTask.executable = "${testJavaHome}/bin/java" } + testTask.dependsOn project.tasks.compileTestJava } } } From 89c6474e6940d50747ab9162ac535a3b281e6624 Mon Sep 17 00:00:00 2001 From: aIbrahiim Date: Wed, 29 Oct 2025 14:19:12 +0300 Subject: [PATCH 03/12] Fix Java8 test failures --- .../org/apache/beam/gradle/BeamModulePlugin.groovy | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy b/buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy index 4d8e05b7aaa7..5dec89c26395 100644 --- a/buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy +++ b/buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy @@ -1666,10 +1666,6 @@ class BeamModulePlugin implements Plugin { project.tasks.compileTestJava { setCompileAndRuntimeJavaVersion(options.compilerArgs, ver) project.ext.setJavaVerOptions(options, ver) - if (testJavaHome) { - options.fork = true - options.forkOptions.executable = "${testJavaHome}/bin/javac" - } if (ver == '25') { // TODO: Upgrade errorprone version to support Java25. Currently compile crashes // java.lang.NoSuchFieldError: Class com.sun.tools.javac.code.TypeTag does not have member field @@ -1677,6 +1673,13 @@ class BeamModulePlugin implements Plugin { options.errorprone.enabled = false } outputs.upToDateWhen { false } + doFirst { + project.sourceSets.test.output.classesDirs.each { dir -> + if (dir.exists()) { + project.delete(dir) + } + } + } } project.tasks.withType(Test).configureEach { useJUnit() From 7f8d3cdb4e2ce554d64aa72a025dd2e42b7854ea Mon Sep 17 00:00:00 2001 From: aIbrahiim Date: Wed, 29 Oct 2025 14:40:26 +0300 Subject: [PATCH 04/12] Fix Java8 test failures --- .../main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy b/buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy index 5dec89c26395..267641476af4 100644 --- a/buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy +++ b/buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy @@ -1676,8 +1676,9 @@ class BeamModulePlugin implements Plugin { doFirst { project.sourceSets.test.output.classesDirs.each { dir -> if (dir.exists()) { - project.delete(dir) + project.delete(project.fileTree(dir)) } + dir.mkdirs() } } } From 076d3545577e3ca8889272c0e7a14daa4f592115 Mon Sep 17 00:00:00 2001 From: aIbrahiim Date: Wed, 29 Oct 2025 15:19:30 +0300 Subject: [PATCH 05/12] Fix Java8 test failures --- .../beam/gradle/BeamModulePlugin.groovy | 24 +++++++++++++++---- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy b/buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy index 267641476af4..21e3ce405ee7 100644 --- a/buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy +++ b/buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy @@ -1663,6 +1663,16 @@ class BeamModulePlugin implements Plugin { String ver = project.getProperty('testJavaVersion') def testJavaHome = project.getProperty("java${ver}Home") + def cleanTestClassesTask = project.tasks.register("cleanTestClassesForJava${ver}") { + outputs.upToDateWhen { false } + doLast { + project.sourceSets.test.output.classesDirs.each { dir -> + if (dir.exists()) { + project.fileTree(dir).matching { include '**/*.class' }.each { it.delete() } + } + } + } + } project.tasks.compileTestJava { setCompileAndRuntimeJavaVersion(options.compilerArgs, ver) project.ext.setJavaVerOptions(options, ver) @@ -1673,18 +1683,21 @@ class BeamModulePlugin implements Plugin { options.errorprone.enabled = false } outputs.upToDateWhen { false } + dependsOn cleanTestClassesTask doFirst { - project.sourceSets.test.output.classesDirs.each { dir -> - if (dir.exists()) { - project.delete(project.fileTree(dir)) - } - dir.mkdirs() + if (!testJavaHome) { + throw new GradleException("testJavaVersion=${ver} requires java${ver}Home property to be set") + } + if (!options.forkOptions.javaHome || !options.forkOptions.javaHome.exists()) { + options.fork = true + options.forkOptions.javaHome = testJavaHome as File } } } project.tasks.withType(Test).configureEach { useJUnit() executable = "${testJavaHome}/bin/java" + dependsOn cleanTestClassesTask dependsOn project.tasks.compileTestJava } project.afterEvaluate { @@ -1692,6 +1705,7 @@ class BeamModulePlugin implements Plugin { if (testJavaHome) { testTask.executable = "${testJavaHome}/bin/java" } + testTask.dependsOn cleanTestClassesTask testTask.dependsOn project.tasks.compileTestJava } } From ee49dd0e8e1d2de11bcd8cdf7acacfcac5838aa3 Mon Sep 17 00:00:00 2001 From: aIbrahiim Date: Wed, 29 Oct 2025 15:49:18 +0300 Subject: [PATCH 06/12] Fix Java8 test failures --- .../org/apache/beam/gradle/BeamModulePlugin.groovy | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy b/buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy index 21e3ce405ee7..7d9ab8bb8dca 100644 --- a/buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy +++ b/buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy @@ -1665,10 +1665,10 @@ class BeamModulePlugin implements Plugin { def cleanTestClassesTask = project.tasks.register("cleanTestClassesForJava${ver}") { outputs.upToDateWhen { false } - doLast { + doFirst { project.sourceSets.test.output.classesDirs.each { dir -> if (dir.exists()) { - project.fileTree(dir).matching { include '**/*.class' }.each { it.delete() } + project.delete(dir) } } } @@ -1688,10 +1688,13 @@ class BeamModulePlugin implements Plugin { if (!testJavaHome) { throw new GradleException("testJavaVersion=${ver} requires java${ver}Home property to be set") } - if (!options.forkOptions.javaHome || !options.forkOptions.javaHome.exists()) { - options.fork = true - options.forkOptions.javaHome = testJavaHome as File + def javaHomeFile = testJavaHome as File + if (!javaHomeFile.exists()) { + throw new GradleException("testJavaVersion=${ver} java${ver}Home directory does not exist: ${javaHomeFile}") } + options.fork = true + options.forkOptions.javaHome = javaHomeFile + options.forkOptions.executable = "${javaHomeFile}/bin/javac" } } project.tasks.withType(Test).configureEach { From e374affd1d2b8acf961267c0cd0a1318bc890f36 Mon Sep 17 00:00:00 2001 From: aIbrahiim Date: Wed, 29 Oct 2025 16:18:33 +0300 Subject: [PATCH 07/12] Fix Java8 test failures --- .../beam/gradle/BeamModulePlugin.groovy | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy b/buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy index 7d9ab8bb8dca..bab9fdd4622c 100644 --- a/buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy +++ b/buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy @@ -1675,7 +1675,26 @@ class BeamModulePlugin implements Plugin { } project.tasks.compileTestJava { setCompileAndRuntimeJavaVersion(options.compilerArgs, ver) - project.ext.setJavaVerOptions(options, ver) + // Manually set fork options instead of using setJavaVerOptions to ensure we have the correct property + if (ver == '8') { + options.compilerArgs += ['-Xlint:-path'] + } else if (ver == '11') { + options.compilerArgs += ['-Xlint:-path'] + } else if (ver == '17') { + options.compilerArgs += ['-Xlint:-path'] + options.errorprone.errorproneArgs.add("-XepDisableAllChecks") + options.forkOptions.jvmArgs += errorProneAddModuleOpts.collect { '-J' + it } + } else if (ver == '21' || ver == '25') { + options.compilerArgs += ['-Xlint:-path', '-Xlint:-this-escape'] + if (ver == '25') { + options.compilerArgs += ['-Xlint:-dangling-doc-comments'] + } + options.errorprone.errorproneArgs.add("-XepDisableAllChecks") + options.forkOptions.jvmArgs += errorProneAddModuleOpts.collect { '-J' + it } + project.checkerFramework { + skipCheckerFramework = true + } + } if (ver == '25') { // TODO: Upgrade errorprone version to support Java25. Currently compile crashes // java.lang.NoSuchFieldError: Class com.sun.tools.javac.code.TypeTag does not have member field From 8cdc1b2b2d3afc4904994e4f4a891e86bf4cbccd Mon Sep 17 00:00:00 2001 From: aIbrahiim Date: Wed, 29 Oct 2025 17:02:45 +0300 Subject: [PATCH 08/12] Fix Java8 test failures --- .../groovy/org/apache/beam/gradle/BeamModulePlugin.groovy | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy b/buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy index bab9fdd4622c..c38aaa50cdd9 100644 --- a/buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy +++ b/buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy @@ -1712,6 +1712,10 @@ class BeamModulePlugin implements Plugin { throw new GradleException("testJavaVersion=${ver} java${ver}Home directory does not exist: ${javaHomeFile}") } options.fork = true + // Clear any toolchain settings to avoid conflicts with forkOptions.javaHome + options.forkOptions.javaCompiler = null + options.forkOptions.executable = null + // Set javaHome and executable to use Java 8 compiler options.forkOptions.javaHome = javaHomeFile options.forkOptions.executable = "${javaHomeFile}/bin/javac" } From 28eec77fadb41213c579b1b62b68364ee6e84f2a Mon Sep 17 00:00:00 2001 From: aIbrahiim Date: Wed, 29 Oct 2025 18:16:33 +0300 Subject: [PATCH 09/12] Fix Java8 test failures --- .../groovy/org/apache/beam/gradle/BeamModulePlugin.groovy | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy b/buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy index c38aaa50cdd9..06c21b842988 100644 --- a/buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy +++ b/buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy @@ -1711,13 +1711,9 @@ class BeamModulePlugin implements Plugin { if (!javaHomeFile.exists()) { throw new GradleException("testJavaVersion=${ver} java${ver}Home directory does not exist: ${javaHomeFile}") } - options.fork = true - // Clear any toolchain settings to avoid conflicts with forkOptions.javaHome - options.forkOptions.javaCompiler = null - options.forkOptions.executable = null - // Set javaHome and executable to use Java 8 compiler + options.fork =াবে true + // Set javaHome to use Java 8 compiler - setting executable explicitly can cause toolchain conflicts options.forkOptions.javaHome = javaHomeFile - options.forkOptions.executable = "${javaHomeFile}/bin/javac" } } project.tasks.withType(Test).configureEach { From 93a8f2210d7391503dc543a15ece4966d5e10ca0 Mon Sep 17 00:00:00 2001 From: aIbrahiim Date: Wed, 29 Oct 2025 18:51:45 +0300 Subject: [PATCH 10/12] Fix Java8 test failures --- .../beam/gradle/BeamModulePlugin.groovy | 40 ++++++------------- 1 file changed, 12 insertions(+), 28 deletions(-) diff --git a/buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy b/buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy index 06c21b842988..f50556076c70 100644 --- a/buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy +++ b/buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy @@ -1675,26 +1675,15 @@ class BeamModulePlugin implements Plugin { } project.tasks.compileTestJava { setCompileAndRuntimeJavaVersion(options.compilerArgs, ver) - // Manually set fork options instead of using setJavaVerOptions to ensure we have the correct property - if (ver == '8') { - options.compilerArgs += ['-Xlint:-path'] - } else if (ver == '11') { - options.compilerArgs += ['-Xlint:-path'] - } else if (ver == '17') { - options.compilerArgs += ['-Xlint:-path'] - options.errorprone.errorproneArgs.add("-XepDisableAllChecks") - options.forkOptions.jvmArgs += errorProneAddModuleOpts.collect { '-J' + it } - } else if (ver == '21' || ver == '25') { - options.compilerArgs += ['-Xlint:-path', '-Xlint:-this-escape'] - if (ver == '25') { - options.compilerArgs += ['-Xlint:-dangling-doc-comments'] - } - options.errorprone.errorproneArgs.add("-XepDisableAllChecks") - options.forkOptions.jvmArgs += errorProneAddModuleOpts.collect { '-J' + it } - project.checkerFramework { - skipCheckerFramework = true - } + // Validate javaHome exists before configuring fork options + def javaHomeFile = testJavaHome as File + if (!javaHomeFile.exists()) { + throw new GradleException("testJavaVersion=${ver} java${ver}Home directory does not exist: ${javaHomeFile}") } + // Use setJavaVerOptions to configure fork with the correct Java version + // Note: setJavaVerOptions uses findProperty, but we've already validated it exists above + project.ext.setJavaVerOptions(options, ver) + if (ver == '25') { // TODO: Upgrade errorprone version to support Java25. Currently compile crashes // java.lang.NoSuchFieldError: Class com.sun.tools.javac.code.TypeTag does not have member field @@ -1704,16 +1693,11 @@ class BeamModulePlugin implements Plugin { outputs.upToDateWhen { false } dependsOn cleanTestClassesTask doFirst { - if (!testJavaHome) { - throw new GradleException("testJavaVersion=${ver} requires java${ver}Home property to be set") - } - def javaHomeFile = testJavaHome as File - if (!javaHomeFile.exists()) { - throw new GradleException("testJavaVersion=${ver} java${ver}Home directory does not exist: ${javaHomeFile}") + // Ensure fork is enabled (setJavaVerOptions should have done this, but double-check as fallback) + if (!options.fork) { + options.fork = true + options.forkOptions.javaHome = javaHomeFile } - options.fork =াবে true - // Set javaHome to use Java 8 compiler - setting executable explicitly can cause toolchain conflicts - options.forkOptions.javaHome = javaHomeFile } } project.tasks.withType(Test).configureEach { From 76e5734219f94f3ef460c9d516f9dd745568d6c0 Mon Sep 17 00:00:00 2001 From: aIbrahiim Date: Wed, 29 Oct 2025 19:16:52 +0300 Subject: [PATCH 11/12] Fix Java8 test failures --- .../groovy/org/apache/beam/gradle/BeamModulePlugin.groovy | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy b/buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy index f50556076c70..6fc3fc69a1c6 100644 --- a/buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy +++ b/buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy @@ -1291,8 +1291,10 @@ class BeamModulePlugin implements Plugin { // hadoop uses an old version of logback with CVE reports // force all transitive logback deps to a newer one - force "ch.qos.logback:logback-classic:$logback_version" - force "ch.qos.logback:logback-core:$logback_version" + // Use Java 8 compatible version when running tests with Java 8 + def logbackTestVersion = project.findProperty('testJavaVersion') == '8' ? '1.4.17' : logback_version + force "ch.qos.logback:logback-classic:$logbackTestVersion" + force "ch.qos.logback:logback-core:$logbackTestVersion" } } } From db777990092131146430082f9015647db34c9c98 Mon Sep 17 00:00:00 2001 From: aIbrahiim Date: Thu, 30 Oct 2025 00:59:26 +0300 Subject: [PATCH 12/12] Fix Java8 test failures --- .../apache/beam/gradle/BeamModulePlugin.groovy | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy b/buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy index 6fc3fc69a1c6..1ed3b9d9b776 100644 --- a/buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy +++ b/buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy @@ -1291,10 +1291,19 @@ class BeamModulePlugin implements Plugin { // hadoop uses an old version of logback with CVE reports // force all transitive logback deps to a newer one - // Use Java 8 compatible version when running tests with Java 8 - def logbackTestVersion = project.findProperty('testJavaVersion') == '8' ? '1.4.17' : logback_version - force "ch.qos.logback:logback-classic:$logbackTestVersion" - force "ch.qos.logback:logback-core:$logbackTestVersion" + // When running tests with Java 8, use Java 8 compatible version only for test runtime configurations + // (not compile configurations to avoid dependency resolution failures) + // Only apply Java 8 compatible logback to explicit test runtime configurations, not compile/testCompile/testImplementation + def configName = config.getName().toLowerCase() + def isTestRuntimeConfig = (configName == 'testruntimeclasspath' || + configName == 'testruntimeonly' || + configName == 'testruntimemigration' || + configName == 'shadowtestruntimeclasspath') + // Use logback 1.4.14 for Java 8 test runtime (last stable 1.4.x that supports Java 8) + // Logback 1.5.x requires Java 11+, so we must use 1.4.x when running tests with Java 8 + def logbackVersionToUse = (isTestRuntimeConfig && project.findProperty('testJavaVersion') == '8') ? '1.4.14' : logback_version + force "ch.qos.logback:logback-classic:$logbackVersionToUse" + force "ch.qos.logback:logback-core:$logbackVersionToUse" } } }