diff --git a/changelog/@unreleased/pr-2406.v2.yml b/changelog/@unreleased/pr-2406.v2.yml new file mode 100644 index 000000000..e5ec2b289 --- /dev/null +++ b/changelog/@unreleased/pr-2406.v2.yml @@ -0,0 +1,6 @@ +type: fix +fix: + description: baseline-immutables adds required exports to the java compiler for + compatibility with jdk-17+ + links: + - https://github.com/palantir/gradle-baseline/pull/2406 diff --git a/gradle-baseline-java/src/main/groovy/com/palantir/baseline/plugins/BaselineImmutables.java b/gradle-baseline-java/src/main/groovy/com/palantir/baseline/plugins/BaselineImmutables.java index 2ecc1c884..cc32cc4b8 100644 --- a/gradle-baseline-java/src/main/groovy/com/palantir/baseline/plugins/BaselineImmutables.java +++ b/gradle-baseline-java/src/main/groovy/com/palantir/baseline/plugins/BaselineImmutables.java @@ -16,6 +16,7 @@ package com.palantir.baseline.plugins; +import com.google.common.collect.ImmutableList; import java.util.Collections; import java.util.Objects; import org.gradle.api.Plugin; @@ -28,6 +29,11 @@ public final class BaselineImmutables implements Plugin { + private static final ImmutableList GRADLE_INCREMENTAL = ImmutableList.of("-Aimmutables.gradle.incremental"); + // See https://github.com/immutables/immutables/issues/1379 + private static final ImmutableList EXPORTS = + ImmutableList.of("--add-exports=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED"); + @Override public void apply(Project project) { project.getPluginManager().withPlugin("java", unused -> { @@ -42,11 +48,21 @@ public void apply(Project project) { .add(new CommandLineArgumentProvider() { @Override public Iterable asArguments() { - if (hasImmutablesProcessor(project, sourceSet)) { - return Collections.singletonList("-Aimmutables.gradle.incremental"); - } - - return Collections.emptyList(); + return hasImmutablesProcessor(project, sourceSet) + ? GRADLE_INCREMENTAL + : Collections.emptyList(); + } + }); + javaCompileTask + .getOptions() + .getForkOptions() + .getJvmArgumentProviders() + .add(new CommandLineArgumentProvider() { + @Override + public Iterable asArguments() { + return hasImmutablesProcessor(project, sourceSet) + ? EXPORTS + : Collections.emptyList(); } }); }); diff --git a/gradle-baseline-java/src/test/groovy/com/palantir/baseline/plugins/BaselineImmutablesTest.groovy b/gradle-baseline-java/src/test/groovy/com/palantir/baseline/plugins/BaselineImmutablesTest.groovy index 4bfe19f52..e28e08a6f 100644 --- a/gradle-baseline-java/src/test/groovy/com/palantir/baseline/plugins/BaselineImmutablesTest.groovy +++ b/gradle-baseline-java/src/test/groovy/com/palantir/baseline/plugins/BaselineImmutablesTest.groovy @@ -16,10 +16,13 @@ package com.palantir.baseline.plugins +import com.google.common.collect.ImmutableList import nebula.test.IntegrationSpec +import nebula.test.functional.ExecutionResult class BaselineImmutablesTest extends IntegrationSpec { private static final String IMMUTABLES = 'org.immutables:value:2.8.8' + private static final String IMMUTABLES_ANNOTATIONS = 'org.immutables:value:2.8.8:annotations' def 'inserts incremental compilation args into source sets that have immutables'() { buildFile << """ @@ -79,4 +82,50 @@ class BaselineImmutablesTest extends IntegrationSpec { stdout.contains 'compileDoesNotHaveImmutablesJava: []' stdout.contains 'compileHasImmutablesAddedInAfterEvaluateJava: [-Aimmutables.gradle.incremental]' } + + def 'Compatible with java #javaVersion'() { + when: + buildFile << """ + apply plugin: 'com.palantir.baseline-java-versions' + apply plugin: 'com.palantir.baseline-immutables' + apply plugin: 'java-library' + repositories { + mavenCentral() + } + tasks.withType(JavaCompile).configureEach({ + options.compilerArgs += ['-Werror'] + }) + javaVersions { + libraryTarget = $javaVersion + } + dependencies { + annotationProcessor '$IMMUTABLES' + compileOnly '$IMMUTABLES_ANNOTATIONS' + } + """.stripIndent() + writeJavaSourceFile(""" + package com.palantir.one; + import com.palantir.two.ImmutableTwo; + import org.immutables.value.Value; + @Value.Immutable + public interface One { + ImmutableTwo two(); + } + """.stripIndent()) + writeJavaSourceFile(""" + package com.palantir.two; + import org.immutables.value.Value; + @Value.Immutable + public interface Two { + String value(); + } + """.stripIndent()) + then: + ExecutionResult result = runTasks('compileJava') + println(result.standardError) + result.success + + where: + javaVersion << ImmutableList.of(11, 17) + } }