From e18eb08222d549a10e4bafc2710a45ea18580ee3 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Mon, 21 Jun 2021 14:08:53 +0100 Subject: [PATCH] Fix additional metadata locations with config cache Previously, a project with a dependency on Spring Boot's configuration processor would fail to build when the configuration cache is enabled due to it accessing the Project during task execution. Instead of accessing the project during task execution, this commit updates the code to retrieve the resource locations from the matching source set in advance. The locations are then stored in the action that configures the compile task when needed. Closes gh-26880 --- .../boot/gradle/plugin/JavaPluginAction.java | 30 +++++++++++-------- .../JavaPluginActionIntegrationTests.java | 4 +-- .../JavaPluginActionIntegrationTests.gradle | 12 +++++--- 3 files changed, 27 insertions(+), 19 deletions(-) diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/JavaPluginAction.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/JavaPluginAction.java index ec938987b06..fb2a1c076a7 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/JavaPluginAction.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/JavaPluginAction.java @@ -19,7 +19,6 @@ package org.springframework.boot.gradle.plugin; import java.io.File; import java.util.Collections; import java.util.List; -import java.util.Optional; import java.util.Set; import org.gradle.api.Action; @@ -41,6 +40,7 @@ import org.gradle.api.plugins.JavaPluginConvention; import org.gradle.api.plugins.JavaPluginExtension; import org.gradle.api.provider.Provider; import org.gradle.api.tasks.SourceSet; +import org.gradle.api.tasks.SourceSetContainer; import org.gradle.api.tasks.TaskProvider; import org.gradle.api.tasks.compile.JavaCompile; import org.gradle.jvm.toolchain.JavaToolchainService; @@ -200,7 +200,11 @@ final class JavaPluginAction implements PluginApplicationAction { } private void configureAdditionalMetadataLocations(JavaCompile compile) { - compile.doFirst(new AdditionalMetadataLocationsConfigurer()); + SourceSetContainer sourceSets = compile.getProject().getConvention().getPlugin(JavaPluginConvention.class) + .getSourceSets(); + sourceSets.stream().filter((candidate) -> candidate.getCompileJavaTaskName().equals(compile.getName())) + .map((match) -> match.getResources().getSrcDirs()).findFirst() + .ifPresent((locations) -> compile.doFirst(new AdditionalMetadataLocationsConfigurer(locations))); } private void configureDevelopmentOnlyConfiguration(Project project) { @@ -230,7 +234,13 @@ final class JavaPluginAction implements PluginApplicationAction { * inner-class rather than a lambda due to * https://github.com/gradle/gradle/issues/5510. */ - private static class AdditionalMetadataLocationsConfigurer implements Action { + private static final class AdditionalMetadataLocationsConfigurer implements Action { + + private final Set locations; + + private AdditionalMetadataLocationsConfigurer(Set locations) { + this.locations = locations; + } @Override public void execute(Task task) { @@ -239,8 +249,7 @@ final class JavaPluginAction implements PluginApplicationAction { } JavaCompile compile = (JavaCompile) task; if (hasConfigurationProcessorOnClasspath(compile)) { - findMatchingSourceSet(compile) - .ifPresent((sourceSet) -> configureAdditionalMetadataLocations(compile, sourceSet)); + configureAdditionalMetadataLocations(compile); } } @@ -251,15 +260,10 @@ final class JavaPluginAction implements PluginApplicationAction { .anyMatch((name) -> name.startsWith("spring-boot-configuration-processor")); } - private Optional findMatchingSourceSet(JavaCompile compile) { - return compile.getProject().getConvention().getPlugin(JavaPluginConvention.class).getSourceSets().stream() - .filter((sourceSet) -> sourceSet.getCompileJavaTaskName().equals(compile.getName())).findFirst(); - } - - private void configureAdditionalMetadataLocations(JavaCompile compile, SourceSet sourceSet) { - String locations = StringUtils.collectionToCommaDelimitedString(sourceSet.getResources().getSrcDirs()); + private void configureAdditionalMetadataLocations(JavaCompile compile) { compile.getOptions().getCompilerArgs() - .add("-Aorg.springframework.boot.configurationprocessor.additionalMetadataLocations=" + locations); + .add("-Aorg.springframework.boot.configurationprocessor.additionalMetadataLocations=" + + StringUtils.collectionToCommaDelimitedString(this.locations)); } } diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/plugin/JavaPluginActionIntegrationTests.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/plugin/JavaPluginActionIntegrationTests.java index 720941b90c4..1f6ba6dac22 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/plugin/JavaPluginActionIntegrationTests.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/plugin/JavaPluginActionIntegrationTests.java @@ -31,11 +31,11 @@ import org.springframework.boot.gradle.testkit.GradleBuild; import static org.assertj.core.api.Assertions.assertThat; /** - * Integration tests for {@link WarPluginAction}. + * Integration tests for {@link JavaPluginAction}. * * @author Andy Wilkinson */ -@GradleCompatibility +@GradleCompatibility(configurationCache = true) class JavaPluginActionIntegrationTests { GradleBuild gradleBuild; diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/plugin/JavaPluginActionIntegrationTests.gradle b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/plugin/JavaPluginActionIntegrationTests.gradle index 7ffcce40abf..e96ca9aa281 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/plugin/JavaPluginActionIntegrationTests.gradle +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/plugin/JavaPluginActionIntegrationTests.gradle @@ -37,9 +37,13 @@ task('configurationAttributes') { } task('configurationResolvabilityAndConsumability') { - doFirst { - def configuration = configurations.findByName(configurationName) - println "canBeResolved: ${configuration.canBeResolved}" - println "canBeConsumed: ${configuration.canBeConsumed}" + if (project.hasProperty("configurationName")) { + Configuration configuration = configurations.findByName(configurationName) + def canBeResolved = configuration.canBeResolved + def canBeConsumed = configuration.canBeConsumed + doFirst { + println "canBeResolved: ${canBeResolved}" + println "canBeConsumed: ${canBeConsumed}" + } } } \ No newline at end of file