diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/SpringBootAotPlugin.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/SpringBootAotPlugin.java index 00ba72184993..a4b88c5136b7 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/SpringBootAotPlugin.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/SpringBootAotPlugin.java @@ -35,6 +35,7 @@ import org.gradle.api.plugins.JavaPluginExtension; import org.gradle.api.plugins.PluginContainer; import org.gradle.api.provider.Provider; +import org.gradle.api.provider.ProviderFactory; import org.gradle.api.tasks.SourceSet; import org.gradle.api.tasks.SourceSetContainer; import org.gradle.api.tasks.TaskProvider; @@ -150,7 +151,7 @@ private void configureAotTask(Project project, SourceSet sourceSet, AbstractAot task.getArtifactId().set(project.provider(() -> project.getName())); } - @SuppressWarnings("unchecked") + @SuppressWarnings({ "unchecked", "rawtypes" }) private Configuration createAotProcessingClasspath(Project project, String taskName, SourceSet inputSourceSet) { Configuration base = project.getConfigurations() .getByName(inputSourceSet.getRuntimeClasspathConfigurationName()); @@ -160,9 +161,11 @@ private Configuration createAotProcessingClasspath(Project project, String taskN classpath.setDescription("Classpath of the " + taskName + " task."); removeDevelopmentOnly(base.getExtendsFrom()).forEach(classpath::extendsFrom); classpath.attributes((attributes) -> { + ProviderFactory providers = project.getProviders(); AttributeContainer baseAttributes = base.getAttributes(); - for (Attribute attribute : baseAttributes.keySet()) { - attributes.attribute((Attribute) attribute, baseAttributes.getAttribute(attribute)); + for (Attribute attribute : baseAttributes.keySet()) { + attributes.attributeProvider(attribute, + providers.provider(() -> baseAttributes.getAttribute(attribute))); } }); }); diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/plugin/SpringBootAotPluginIntegrationTests.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/plugin/SpringBootAotPluginIntegrationTests.java index b3d9932037ac..aead5ebcc535 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/plugin/SpringBootAotPluginIntegrationTests.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/plugin/SpringBootAotPluginIntegrationTests.java @@ -23,11 +23,14 @@ import org.gradle.testkit.runner.TaskOutcome; import org.junit.jupiter.api.TestTemplate; +import org.junit.jupiter.api.condition.EnabledOnJre; +import org.junit.jupiter.api.condition.JRE; import org.springframework.boot.gradle.junit.GradleCompatibility; import org.springframework.boot.testsupport.gradle.testkit.GradleBuild; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatNoException; /** * Integration tests for {@link SpringBootAotPlugin}. @@ -121,6 +124,13 @@ void processTestAotIsSkippedWhenProjectHasNoTestSource() { .isEqualTo(TaskOutcome.NO_SOURCE); } + // gh-37343 + @TestTemplate + @EnabledOnJre(JRE.JAVA_17) + void applyingAotPluginDoesNotPreventConfigurationOfJavaToolchainLanguageVersion() { + assertThatNoException().isThrownBy(() -> this.gradleBuild.build("help").getOutput()); + } + private void writeMainClass(String packageName, String className) throws IOException { File java = new File(this.gradleBuild.getProjectDir(), "src/main/java/" + packageName.replace(".", "/") + "/" + className + ".java"); diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/plugin/SpringBootAotPluginIntegrationTests-applyingAotPluginDoesNotPreventConfigurationOfJavaToolchainLanguageVersion.gradle b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/plugin/SpringBootAotPluginIntegrationTests-applyingAotPluginDoesNotPreventConfigurationOfJavaToolchainLanguageVersion.gradle new file mode 100644 index 000000000000..da216cf930bf --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/plugin/SpringBootAotPluginIntegrationTests-applyingAotPluginDoesNotPreventConfigurationOfJavaToolchainLanguageVersion.gradle @@ -0,0 +1,11 @@ +plugins { + id 'org.springframework.boot' + id 'org.springframework.boot.aot' + id 'java' +} + +java { + toolchain { + languageVersion.set(JavaLanguageVersion.of(17)) + } +}