Stop configuring AOT-generated classes as output of AOT source set

Closes gh-32940
This commit is contained in:
Andy Wilkinson 2022-10-31 17:28:45 +00:00
parent 2bb9b2640e
commit 0103e24bbb
2 changed files with 10 additions and 8 deletions

View File

@ -27,6 +27,7 @@ import org.gradle.api.Action;
import org.gradle.api.Plugin; import org.gradle.api.Plugin;
import org.gradle.api.Project; import org.gradle.api.Project;
import org.gradle.api.artifacts.Configuration; import org.gradle.api.artifacts.Configuration;
import org.gradle.api.file.FileCollection;
import org.gradle.api.plugins.ExtensionAware; import org.gradle.api.plugins.ExtensionAware;
import org.gradle.api.plugins.JavaPlugin; import org.gradle.api.plugins.JavaPlugin;
import org.gradle.api.plugins.JavaPluginExtension; import org.gradle.api.plugins.JavaPluginExtension;
@ -69,8 +70,9 @@ class NativeImagePluginAction implements PluginApplicationAction {
private void configureMainNativeBinaryClasspath(Project project, SourceSetContainer sourceSets, private void configureMainNativeBinaryClasspath(Project project, SourceSetContainer sourceSets,
GraalVMExtension graalVmExtension) { GraalVMExtension graalVmExtension) {
SourceSetOutput output = sourceSets.getByName(SpringBootAotPlugin.AOT_SOURCE_SET_NAME).getOutput(); FileCollection runtimeClasspath = sourceSets.getByName(SpringBootAotPlugin.AOT_SOURCE_SET_NAME)
graalVmExtension.getBinaries().getByName(NativeImagePlugin.NATIVE_MAIN_EXTENSION).classpath(output); .getRuntimeClasspath();
graalVmExtension.getBinaries().getByName(NativeImagePlugin.NATIVE_MAIN_EXTENSION).classpath(runtimeClasspath);
Configuration nativeImageClasspath = project.getConfigurations().getByName("nativeImageClasspath"); Configuration nativeImageClasspath = project.getConfigurations().getByName("nativeImageClasspath");
nativeImageClasspath.setExtendsFrom(removeDevelopmentOnly(nativeImageClasspath.getExtendsFrom())); nativeImageClasspath.setExtendsFrom(removeDevelopmentOnly(nativeImageClasspath.getExtendsFrom()));
} }

View File

@ -89,8 +89,7 @@ public class SpringBootAotPlugin implements Plugin<Project> {
return sourceSets.create(newSourceSetName, (sourceSet) -> { return sourceSets.create(newSourceSetName, (sourceSet) -> {
sourceSet.getJava().setSrcDirs(List.of("build/generated/" + newSourceSetName + "Sources")); sourceSet.getJava().setSrcDirs(List.of("build/generated/" + newSourceSetName + "Sources"));
sourceSet.getResources().setSrcDirs(List.of("build/generated/" + newSourceSetName + "Resources")); sourceSet.getResources().setSrcDirs(List.of("build/generated/" + newSourceSetName + "Resources"));
project.getDependencies().add(existingSourceSet.getRuntimeClasspathConfigurationName(), existingSourceSet.setRuntimeClasspath(existingSourceSet.getRuntimeClasspath().plus(sourceSet.getOutput()));
project.files(sourceSet.getOutput()));
project.getConfigurations().getByName(sourceSet.getCompileClasspathConfigurationName()) project.getConfigurations().getByName(sourceSet.getCompileClasspathConfigurationName())
.attributes((attributes) -> { .attributes((attributes) -> {
configureClassesAndResourcesLibraryElementsAttribute(project, attributes); configureClassesAndResourcesLibraryElementsAttribute(project, attributes);
@ -116,6 +115,7 @@ public class SpringBootAotPlugin implements Plugin<Project> {
Provider<Directory> aotClasses = project.getLayout().getBuildDirectory().dir("generated/aotClasses"); Provider<Directory> aotClasses = project.getLayout().getBuildDirectory().dir("generated/aotClasses");
Configuration aotClasspath = createAotProcessingClasspath(project, PROCESS_AOT_TASK_NAME, mainSourceSet); Configuration aotClasspath = createAotProcessingClasspath(project, PROCESS_AOT_TASK_NAME, mainSourceSet);
project.getDependencies().add(aotClasspath.getName(), project.files(mainSourceSet.getOutput())); project.getDependencies().add(aotClasspath.getName(), project.files(mainSourceSet.getOutput()));
mainSourceSet.setRuntimeClasspath(mainSourceSet.getRuntimeClasspath().plus(project.files(aotClasses)));
Configuration compileClasspath = project.getConfigurations() Configuration compileClasspath = project.getConfigurations()
.getByName(aotSourceSet.getCompileClasspathConfigurationName()); .getByName(aotSourceSet.getCompileClasspathConfigurationName());
compileClasspath.extendsFrom(aotClasspath); compileClasspath.extendsFrom(aotClasspath);
@ -127,7 +127,6 @@ public class SpringBootAotPlugin implements Plugin<Project> {
task.setClasspath(aotClasspath); task.setClasspath(aotClasspath);
}); });
project.getDependencies().add(aotSourceSet.getImplementationConfigurationName(), project.files(aotClasses)); project.getDependencies().add(aotSourceSet.getImplementationConfigurationName(), project.files(aotClasses));
aotSourceSet.getOutput().dir(aotClasses);
configureDependsOn(project, aotSourceSet, processAot); configureDependsOn(project, aotSourceSet, processAot);
} }
@ -172,20 +171,21 @@ public class SpringBootAotPlugin implements Plugin<Project> {
SourceSet testSourceSet) { SourceSet testSourceSet) {
Provider<Directory> aotTestClasses = project.getLayout().getBuildDirectory().dir("generated/aotTestClasses"); Provider<Directory> aotTestClasses = project.getLayout().getBuildDirectory().dir("generated/aotTestClasses");
Configuration aotClasspath = createAotProcessingClasspath(project, PROCESS_TEST_AOT_TASK_NAME, testSourceSet); 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() Configuration compileClasspath = project.getConfigurations()
.getByName(aotTestSourceSet.getCompileClasspathConfigurationName()); .getByName(aotTestSourceSet.getCompileClasspathConfigurationName());
compileClasspath.extendsFrom(aotClasspath); compileClasspath.extendsFrom(aotClasspath);
TaskProvider<ProcessTestAot> processTestAot = project.getTasks().register(PROCESS_TEST_AOT_TASK_NAME, TaskProvider<ProcessTestAot> processTestAot = project.getTasks().register(PROCESS_TEST_AOT_TASK_NAME,
ProcessTestAot.class, (task) -> { ProcessTestAot.class, (task) -> {
configureAotTask(project, aotTestSourceSet, task, aotTestClasses, testSourceSet); configureAotTask(project, aotTestSourceSet, task, aotTestClasses, testSourceSet);
task.setClasspath(project.getObjects().fileCollection().from(aotClasspath, task.setClasspath(aotClasspath);
mainSourceSet.getOutput(), testSourceSet.getOutput()));
task.setTestRuntimeClasspath( task.setTestRuntimeClasspath(
project.getConfigurations().getByName(testSourceSet.getImplementationConfigurationName())); project.getConfigurations().getByName(testSourceSet.getImplementationConfigurationName()));
}); });
project.getDependencies().add(aotTestSourceSet.getImplementationConfigurationName(), project.getDependencies().add(aotTestSourceSet.getImplementationConfigurationName(),
project.files(aotTestClasses)); project.files(aotTestClasses));
aotTestSourceSet.getOutput().dir(aotTestClasses);
configureDependsOn(project, aotTestSourceSet, processTestAot); configureDependsOn(project, aotTestSourceSet, processTestAot);
} }