From e72428c4a5aac5af16dc27c12190f756277c482b Mon Sep 17 00:00:00 2001 From: Carter Kozak Date: Mon, 28 Mar 2022 10:33:51 -0400 Subject: [PATCH 1/2] Compilation supports add-exports/add-opens with toolchains Using workaround suggested by: https://github.com/gradle/gradle/issues/18824#issuecomment-1026909824 --- .../baseline/plugins/BaselineJavaVersion.java | 28 ++++++++++ .../plugins/BaselineModuleJvmArgs.java | 51 +++++++++---------- ...aselineModuleJvmArgsIntegrationTest.groovy | 23 +++++++++ 3 files changed, 76 insertions(+), 26 deletions(-) diff --git a/gradle-baseline-java/src/main/groovy/com/palantir/baseline/plugins/BaselineJavaVersion.java b/gradle-baseline-java/src/main/groovy/com/palantir/baseline/plugins/BaselineJavaVersion.java index 54c7460d2..32335370f 100644 --- a/gradle-baseline-java/src/main/groovy/com/palantir/baseline/plugins/BaselineJavaVersion.java +++ b/gradle-baseline-java/src/main/groovy/com/palantir/baseline/plugins/BaselineJavaVersion.java @@ -23,6 +23,7 @@ import org.gradle.api.GradleException; import org.gradle.api.Plugin; import org.gradle.api.Project; +import org.gradle.api.Task; import org.gradle.api.plugins.JavaPluginExtension; import org.gradle.api.provider.Property; import org.gradle.api.provider.Provider; @@ -93,6 +94,15 @@ public void execute(JavaToolchainSpec javaToolchainSpec) { javaToolchainSpec.getLanguageVersion().set(targetVersionProvider); } })); + // Set sourceCompatibility to opt out of '-release', allowing opens/exports to be used. + javaCompile.doFirst(new Action() { + @Override + public void execute(Task task) { + ((JavaCompile) task) + .setSourceCompatibility( + targetVersionProvider.get().toString()); + } + }); } }); @@ -117,6 +127,15 @@ public void execute(JavaToolchainSpec javaToolchainSpec) { javaToolchainSpec.getLanguageVersion().set(targetVersionProvider); } })); + // Set sourceCompatibility to opt out of '-release', allowing opens/exports to be used. + groovyCompile.doFirst(new Action() { + @Override + public void execute(Task task) { + ((GroovyCompile) task) + .setSourceCompatibility( + targetVersionProvider.get().toString()); + } + }); } }); @@ -129,6 +148,15 @@ public void execute(JavaToolchainSpec javaToolchainSpec) { javaToolchainSpec.getLanguageVersion().set(targetVersionProvider); } })); + // Set sourceCompatibility to opt out of '-release', allowing opens/exports to be used. + scalaCompile.doFirst(new Action() { + @Override + public void execute(Task task) { + ((ScalaCompile) task) + .setSourceCompatibility( + targetVersionProvider.get().toString()); + } + }); } }); diff --git a/gradle-baseline-java/src/main/groovy/com/palantir/baseline/plugins/BaselineModuleJvmArgs.java b/gradle-baseline-java/src/main/groovy/com/palantir/baseline/plugins/BaselineModuleJvmArgs.java index 04467b592..c728c6079 100644 --- a/gradle-baseline-java/src/main/groovy/com/palantir/baseline/plugins/BaselineModuleJvmArgs.java +++ b/gradle-baseline-java/src/main/groovy/com/palantir/baseline/plugins/BaselineModuleJvmArgs.java @@ -68,32 +68,31 @@ public void apply(Project project) { // javac isn't provided `--add-exports` args for the time being due to // https://github.com/gradle/gradle/issues/18824 - if (project.hasProperty("add.exports.to.javac")) { - project.getExtensions().getByType(SourceSetContainer.class).configureEach(sourceSet -> { - JavaCompile javaCompile = project.getTasks() - .named(sourceSet.getCompileJavaTaskName(), JavaCompile.class) - .get(); - javaCompile - .getOptions() - .getCompilerArgumentProviders() - // Use an anonymous class because tasks with lambda inputs cannot be cached - .add(new CommandLineArgumentProvider() { - @Override - public Iterable asArguments() { - // Annotation processors are executed at compile time - ImmutableList arguments = - collectAnnotationProcessorArgs(project, extension, sourceSet); - project.getLogger() - .debug( - "BaselineModuleJvmArgs compiling {} on {} with exports: {}", - javaCompile.getName(), - project, - arguments); - return arguments; - } - }); - }); - } + // However, we set sourceCompatibility in BaselineJavaVersion to opt out of the '-release' flag. + project.getExtensions().getByType(SourceSetContainer.class).configureEach(sourceSet -> { + JavaCompile javaCompile = project.getTasks() + .named(sourceSet.getCompileJavaTaskName(), JavaCompile.class) + .get(); + javaCompile + .getOptions() + .getCompilerArgumentProviders() + // Use an anonymous class because tasks with lambda inputs cannot be cached + .add(new CommandLineArgumentProvider() { + @Override + public Iterable asArguments() { + // Annotation processors are executed at compile time + ImmutableList arguments = + collectAnnotationProcessorArgs(project, extension, sourceSet); + project.getLogger() + .debug( + "BaselineModuleJvmArgs compiling {} on {} with exports: {}", + javaCompile.getName(), + project, + arguments); + return arguments; + } + }); + }); project.getTasks().withType(Test.class, new Action() { diff --git a/gradle-baseline-java/src/test/groovy/com/palantir/baseline/BaselineModuleJvmArgsIntegrationTest.groovy b/gradle-baseline-java/src/test/groovy/com/palantir/baseline/BaselineModuleJvmArgsIntegrationTest.groovy index 46aae6ca7..9b577be62 100644 --- a/gradle-baseline-java/src/test/groovy/com/palantir/baseline/BaselineModuleJvmArgsIntegrationTest.groovy +++ b/gradle-baseline-java/src/test/groovy/com/palantir/baseline/BaselineModuleJvmArgsIntegrationTest.groovy @@ -52,6 +52,29 @@ class BaselineModuleJvmArgsIntegrationTest extends IntegrationSpec { buildFile << standardBuildFile } + def 'Compiles with locally defined exports'() { + when: + buildFile << ''' + application { + mainClass = 'com.Example' + } + moduleJvmArgs { + exports = ['jdk.compiler/com.sun.tools.javac.code'] + } + '''.stripIndent(true) + writeJavaSourceFile(''' + package com; + public class Example { + public static void main(String[] args) { + com.sun.tools.javac.code.Symbol.class.toString(); + } + } + '''.stripIndent(true)) + + then: + runTasksSuccessfully('compileJava') + } + def 'Runs with locally defined exports'() { when: buildFile << ''' From 024392bfaa876566cf48b1ef75d228f55a88bf1a Mon Sep 17 00:00:00 2001 From: svc-changelog Date: Mon, 28 Mar 2022 15:10:03 +0000 Subject: [PATCH 2/2] Add generated changelog entries --- changelog/@unreleased/pr-2136.v2.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 changelog/@unreleased/pr-2136.v2.yml diff --git a/changelog/@unreleased/pr-2136.v2.yml b/changelog/@unreleased/pr-2136.v2.yml new file mode 100644 index 000000000..e229d0cd1 --- /dev/null +++ b/changelog/@unreleased/pr-2136.v2.yml @@ -0,0 +1,5 @@ +type: improvement +improvement: + description: Compilation supports add-exports/add-opens with toolchains + links: + - https://github.com/palantir/gradle-baseline/pull/2136