From 0103e24bbbf10dc291c6481540994e00c44b5146 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Mon, 31 Oct 2022 17:28:45 +0000 Subject: [PATCH] Stop configuring AOT-generated classes as output of AOT source set Closes gh-32940 --- .../boot/gradle/plugin/NativeImagePluginAction.java | 6 ++++-- .../boot/gradle/plugin/SpringBootAotPlugin.java | 12 ++++++------ 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/NativeImagePluginAction.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/NativeImagePluginAction.java index 3e2eabc889..2346dca9e6 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/NativeImagePluginAction.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/NativeImagePluginAction.java @@ -27,6 +27,7 @@ import org.gradle.api.Action; import org.gradle.api.Plugin; import org.gradle.api.Project; import org.gradle.api.artifacts.Configuration; +import org.gradle.api.file.FileCollection; import org.gradle.api.plugins.ExtensionAware; import org.gradle.api.plugins.JavaPlugin; import org.gradle.api.plugins.JavaPluginExtension; @@ -69,8 +70,9 @@ class NativeImagePluginAction implements PluginApplicationAction { private void configureMainNativeBinaryClasspath(Project project, SourceSetContainer sourceSets, GraalVMExtension graalVmExtension) { - SourceSetOutput output = sourceSets.getByName(SpringBootAotPlugin.AOT_SOURCE_SET_NAME).getOutput(); - graalVmExtension.getBinaries().getByName(NativeImagePlugin.NATIVE_MAIN_EXTENSION).classpath(output); + FileCollection runtimeClasspath = sourceSets.getByName(SpringBootAotPlugin.AOT_SOURCE_SET_NAME) + .getRuntimeClasspath(); + graalVmExtension.getBinaries().getByName(NativeImagePlugin.NATIVE_MAIN_EXTENSION).classpath(runtimeClasspath); Configuration nativeImageClasspath = project.getConfigurations().getByName("nativeImageClasspath"); nativeImageClasspath.setExtendsFrom(removeDevelopmentOnly(nativeImageClasspath.getExtendsFrom())); } 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 7998937923..ba34eabbea 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 @@ -89,8 +89,7 @@ public class SpringBootAotPlugin implements Plugin { return sourceSets.create(newSourceSetName, (sourceSet) -> { sourceSet.getJava().setSrcDirs(List.of("build/generated/" + newSourceSetName + "Sources")); sourceSet.getResources().setSrcDirs(List.of("build/generated/" + newSourceSetName + "Resources")); - project.getDependencies().add(existingSourceSet.getRuntimeClasspathConfigurationName(), - project.files(sourceSet.getOutput())); + existingSourceSet.setRuntimeClasspath(existingSourceSet.getRuntimeClasspath().plus(sourceSet.getOutput())); project.getConfigurations().getByName(sourceSet.getCompileClasspathConfigurationName()) .attributes((attributes) -> { configureClassesAndResourcesLibraryElementsAttribute(project, attributes); @@ -116,6 +115,7 @@ public class SpringBootAotPlugin implements Plugin { Provider aotClasses = project.getLayout().getBuildDirectory().dir("generated/aotClasses"); Configuration aotClasspath = createAotProcessingClasspath(project, PROCESS_AOT_TASK_NAME, mainSourceSet); project.getDependencies().add(aotClasspath.getName(), project.files(mainSourceSet.getOutput())); + mainSourceSet.setRuntimeClasspath(mainSourceSet.getRuntimeClasspath().plus(project.files(aotClasses))); Configuration compileClasspath = project.getConfigurations() .getByName(aotSourceSet.getCompileClasspathConfigurationName()); compileClasspath.extendsFrom(aotClasspath); @@ -127,7 +127,6 @@ public class SpringBootAotPlugin implements Plugin { task.setClasspath(aotClasspath); }); project.getDependencies().add(aotSourceSet.getImplementationConfigurationName(), project.files(aotClasses)); - aotSourceSet.getOutput().dir(aotClasses); configureDependsOn(project, aotSourceSet, processAot); } @@ -172,20 +171,21 @@ public class SpringBootAotPlugin implements Plugin { SourceSet testSourceSet) { Provider aotTestClasses = project.getLayout().getBuildDirectory().dir("generated/aotTestClasses"); Configuration aotClasspath = createAotProcessingClasspath(project, PROCESS_TEST_AOT_TASK_NAME, testSourceSet); + project.getDependencies().add(aotClasspath.getName(), project.files(mainSourceSet.getOutput())); + project.getDependencies().add(aotClasspath.getName(), project.files(testSourceSet.getOutput())); + testSourceSet.setRuntimeClasspath(testSourceSet.getRuntimeClasspath().plus(project.files(aotTestClasses))); Configuration compileClasspath = project.getConfigurations() .getByName(aotTestSourceSet.getCompileClasspathConfigurationName()); compileClasspath.extendsFrom(aotClasspath); TaskProvider processTestAot = project.getTasks().register(PROCESS_TEST_AOT_TASK_NAME, ProcessTestAot.class, (task) -> { configureAotTask(project, aotTestSourceSet, task, aotTestClasses, testSourceSet); - task.setClasspath(project.getObjects().fileCollection().from(aotClasspath, - mainSourceSet.getOutput(), testSourceSet.getOutput())); + task.setClasspath(aotClasspath); task.setTestRuntimeClasspath( project.getConfigurations().getByName(testSourceSet.getImplementationConfigurationName())); }); project.getDependencies().add(aotTestSourceSet.getImplementationConfigurationName(), project.files(aotTestClasses)); - aotTestSourceSet.getOutput().dir(aotTestClasses); configureDependsOn(project, aotTestSourceSet, processTestAot); }