This is an automated email from the ASF dual-hosted git repository. yhu pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/beam.git
The following commit(s) were added to refs/heads/master by this push: new 73a9c5fb3f6 Fix Java 11 Example PreCommit GItHub Action (#28291) 73a9c5fb3f6 is described below commit 73a9c5fb3f60e3a0cda05f0f148b116328b480cf Author: Yi Hu <ya...@google.com> AuthorDate: Wed Sep 6 13:01:14 2023 -0400 Fix Java 11 Example PreCommit GItHub Action (#28291) * Partially revert #28234 to fix Java 11 Example PreCommit * Dedup compile args * fix typo * Fix compilerArgs addAll * Move compileAndRunTestsWithJavaX after errorprone has set up * Still use --release for java8 option --- ...eam_PreCommit_Java_Examples_Dataflow_Java11.yml | 2 + .../org/apache/beam/gradle/BeamModulePlugin.groovy | 86 ++++++++++++++-------- 2 files changed, 58 insertions(+), 30 deletions(-) diff --git a/.github/workflows/beam_PreCommit_Java_Examples_Dataflow_Java11.yml b/.github/workflows/beam_PreCommit_Java_Examples_Dataflow_Java11.yml index 39910471a8f..8f8a3bba405 100644 --- a/.github/workflows/beam_PreCommit_Java_Examples_Dataflow_Java11.yml +++ b/.github/workflows/beam_PreCommit_Java_Examples_Dataflow_Java11.yml @@ -100,6 +100,8 @@ jobs: service_account_key: ${{ secrets.GCP_SA_KEY }} project_id: ${{ secrets.GCP_PROJECT_ID }} export_default_credentials: true + # The workflow installs java 11 and as default jvm. This is different from + # PreCommit_Java_Examples_Dataflow_Java17 where the build system and sources are compiled with Java8 - name: Set up Java uses: actions/setup-java@v3.8.0 with: 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 a651f0cabea..0c0574b3485 100644 --- a/buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy +++ b/buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy @@ -18,23 +18,24 @@ package org.apache.beam.gradle +import static java.util.UUID.randomUUID + import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar import groovy.json.JsonOutput import groovy.json.JsonSlurper +import java.net.ServerSocket +import java.util.logging.Logger import org.gradle.api.attributes.Category import org.gradle.api.GradleException import org.gradle.api.JavaVersion import org.gradle.api.Plugin import org.gradle.api.Project -import org.gradle.api.Task import org.gradle.api.artifacts.Configuration import org.gradle.api.artifacts.ProjectDependency import org.gradle.api.file.FileCollection import org.gradle.api.file.FileTree -import org.gradle.api.plugins.quality.Checkstyle import org.gradle.api.publish.maven.MavenPublication import org.gradle.api.tasks.Copy -import org.gradle.api.tasks.Delete import org.gradle.api.tasks.Exec import org.gradle.api.tasks.JavaExec import org.gradle.api.tasks.TaskProvider @@ -43,13 +44,10 @@ import org.gradle.api.tasks.compile.CompileOptions import org.gradle.api.tasks.compile.JavaCompile import org.gradle.api.tasks.javadoc.Javadoc import org.gradle.api.tasks.testing.Test -import org.gradle.api.tasks.PathSensitive import org.gradle.api.tasks.PathSensitivity import org.gradle.testing.jacoco.tasks.JacocoReport -import java.net.ServerSocket -import static java.util.UUID.randomUUID /** * This plugin adds methods to configure a module with Beam's defaults, called "natures". * @@ -67,6 +65,8 @@ import static java.util.UUID.randomUUID */ class BeamModulePlugin implements Plugin<Project> { + static final Logger logger = Logger.getLogger(BeamModulePlugin.class.getName()) + /** Licence header enforced by spotless */ static final String javaLicenseHeader = """/* * Licensed to the Apache Software Foundation (ASF) under one @@ -453,6 +453,38 @@ class BeamModulePlugin implements Plugin<Project> { return 'beam' + p.path.replace(':', '-') } + /* + * Set compile args for compiling and running in different java version by modifying the compiler args in place. + * + * Replace `-source X` and `-target X` or `--release X` options if already existed in compilerArgs. + */ + static def setCompileAndRuntimeJavaVersion(List<String> compilerArgs, String ver) { + boolean foundS = false, foundT = false + int foundR = -1 + logger.fine("set java ver ${ver} to compiler args") + for (int i = 0; i < compilerArgs.size()-1; ++i) { + if (compilerArgs.get(i) == '-source') { + foundS = true + compilerArgs.set(i+1, ver) + } else if (compilerArgs.get(i) == '-target') { + foundT = true + compilerArgs.set(i+1, ver) + } else if (compilerArgs.get(i) == '--release') { + foundR = i + } + } + if (foundR != -1) { + compilerArgs.removeAt(foundR + 1) + compilerArgs.removeAt(foundR) + } + if (!foundS) { + compilerArgs.addAll('-source', ver) + } + if (!foundT) { + compilerArgs.addAll('-target', ver) + } + } + void apply(Project project) { /** ***********************************************************************************************/ @@ -1061,13 +1093,12 @@ class BeamModulePlugin implements Plugin<Project> { options.encoding = "UTF-8" // Use -source 8 -target 8 when targeting Java 8 and running on JDK > 8 // - // Consider migrating compilation and testing to use JDK 9+ and setting '-source 8 -target 8' as + // Consider migrating compilation and testing to use JDK 9+ and setting '--release 8' as // the default allowing 'applyJavaNature' to override it for the few modules that need JDK 9+ // artifacts. See https://stackoverflow.com/a/43103038/4368200 for additional details. if (JavaVersion.VERSION_1_8.compareTo(JavaVersion.toVersion(project.javaVersion)) == 0 && JavaVersion.VERSION_1_8.compareTo(JavaVersion.current()) < 0) { - options.compilerArgs += ['-source', '8'] - options.compilerArgs += ['-target', '8'] + options.compilerArgs += ['--release', '8'] // TODO(https://github.com/apache/beam/issues/23901): Fix // optimizerOuterThis breakage options.compilerArgs += ['-XDoptimizeOuterThis=false'] @@ -1089,21 +1120,6 @@ class BeamModulePlugin implements Plugin<Project> { preserveFileTimestamps(false) } - if (project.hasProperty("compileAndRunTestsWithJava11")) { - def java11Home = project.findProperty("java11Home") - project.tasks.compileTestJava { - options.fork = true - options.forkOptions.javaHome = java11Home as File - options.compilerArgs += ['-Xlint:-path'] - options.compilerArgs += ['-source', '11'] - options.compilerArgs += ['-target', '11'] - } - project.tasks.withType(Test) { - useJUnit() - executable = "${java11Home}/bin/java" - } - } - // Configure the default test tasks set of tests executed // to match the equivalent set that is executed by the maven-surefire-plugin. // See http://maven.apache.org/components/surefire/maven-surefire-plugin/test-mojo.html @@ -1240,8 +1256,6 @@ class BeamModulePlugin implements Plugin<Project> { } } - - if (configuration.shadowClosure) { // Ensure that tests are packaged and part of the artifact set. project.task('packageTests', type: Jar) { @@ -1493,18 +1507,30 @@ class BeamModulePlugin implements Plugin<Project> { options.errorprone.errorproneArgs.add("-Xep:Slf4jLoggerShouldBeNonStatic:OFF") } - if (project.hasProperty("compileAndRunTestsWithJava17")) { + if (project.hasProperty("compileAndRunTestsWithJava11")) { + def java11Home = project.findProperty("java11Home") + project.tasks.compileTestJava { + options.fork = true + options.forkOptions.javaHome = java11Home as File + options.compilerArgs += ['-Xlint:-path'] + setCompileAndRuntimeJavaVersion(options.compilerArgs, '11') + } + project.tasks.withType(Test).configureEach { + useJUnit() + executable = "${java11Home}/bin/java" + } + } else if (project.hasProperty("compileAndRunTestsWithJava17")) { def java17Home = project.findProperty("java17Home") project.tasks.compileTestJava { - options.compilerArgs += ['-target', '17'] - options.compilerArgs += ['-source', '17'] + setCompileAndRuntimeJavaVersion(options.compilerArgs, '17') project.ext.setJava17Options(options) } - project.tasks.withType(Test) { + project.tasks.withType(Test).configureEach { useJUnit() executable = "${java17Home}/bin/java" } } + if (configuration.shadowClosure) { // Enables a plugin which can perform shading of classes. See the general comments // above about dependency management for Java projects and how the shadow plugin