From 867c49337a9006f3598d47b8ac2f7f505f7bc846 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Tue, 13 Sep 2022 13:03:24 +0100 Subject: [PATCH 1/2] Add AOT-generated classes to classpath of AOT JavaCompile tasks See gh-32304 --- .../boot/gradle/plugin/SpringBootAotPlugin.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) 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 07b7b813d9..b8292397b9 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 @@ -33,6 +33,7 @@ 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.springframework.boot.gradle.tasks.aot.AbstractAot; import org.springframework.boot.gradle.tasks.aot.ProcessAot; @@ -115,13 +116,16 @@ public class SpringBootAotPlugin implements Plugin { private void registerProcessAotTask(Project project, SourceSet aotSourceSet) { TaskProvider resolveMainClassName = project.getTasks() .named(SpringBootPlugin.RESOLVE_MAIN_CLASS_NAME_TASK_NAME, ResolveMainClassName.class); + Provider aotClasses = project.getLayout().getBuildDirectory().dir("generated/aotClasses"); TaskProvider processAot = project.getTasks().register(PROCESS_AOT_TASK_NAME, ProcessAot.class, (task) -> { - configureAotTask(project, aotSourceSet, task, - project.getLayout().getBuildDirectory().dir("generated/aotClasses")); + configureAotTask(project, aotSourceSet, task, aotClasses); task.getApplicationClass() .set(resolveMainClassName.flatMap(ResolveMainClassName::readMainClassName)); }); + project.getTasks().named(aotSourceSet.getCompileJavaTaskName(), JavaCompile.class).configure( + (javaCompile) -> javaCompile.setClasspath(javaCompile.getClasspath().plus(project.files(aotClasses)))); + aotSourceSet.getOutput().dir(aotClasses); configureDependsOn(project, aotSourceSet, processAot); } @@ -133,7 +137,6 @@ public class SpringBootAotPlugin implements Plugin { task.getClassesDir().set(generatedClasses); task.getGroupId().set(project.provider(() -> String.valueOf(project.getGroup()))); task.getArtifactId().set(project.provider(() -> project.getName())); - sourceSet.getOutput().dir(generatedClasses); } private void configureDependsOn(Project project, SourceSet aotSourceSet, From 88f2b33cc10bc36dcf3e3f175848c0d531e08be0 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Tue, 13 Sep 2022 14:58:16 +0200 Subject: [PATCH 2/2] Add AOT-generated classes to classpath of the compiler See gh-32304 --- .../java/org/springframework/boot/maven/AbstractAotMojo.java | 5 +++-- .../java/org/springframework/boot/maven/ProcessAotMojo.java | 2 +- .../org/springframework/boot/maven/ProcessTestAotMojo.java | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/AbstractAotMojo.java b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/AbstractAotMojo.java index 35f33eabb0..d94305663a 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/AbstractAotMojo.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/AbstractAotMojo.java @@ -137,10 +137,11 @@ public abstract class AbstractAotMojo extends AbstractDependencyFilterMojo { } } - protected final URL[] getClassPath(File classesDirectory, ArtifactsFilter... artifactFilters) - throws MojoExecutionException { + protected final URL[] getClassPath(File classesDirectory, File generatedClassesDirectory, + ArtifactsFilter... artifactFilters) throws MojoExecutionException { List urls = new ArrayList<>(); urls.add(toURL(classesDirectory)); + urls.add(toURL(generatedClassesDirectory)); urls.addAll(getDependencyURLs(artifactFilters)); return urls.toArray(URL[]::new); } diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/ProcessAotMojo.java b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/ProcessAotMojo.java index cf5d124b30..238b478ba7 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/ProcessAotMojo.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/ProcessAotMojo.java @@ -107,7 +107,7 @@ public class ProcessAotMojo extends AbstractAotMojo { } protected URL[] getClassPath() throws Exception { - return getClassPath(this.classesDirectory, new ExcludeTestScopeArtifactFilter()); + return getClassPath(this.classesDirectory, this.generatedClasses, new ExcludeTestScopeArtifactFilter()); } } diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/ProcessTestAotMojo.java b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/ProcessTestAotMojo.java index 423d058f6b..f4a1045370 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/ProcessTestAotMojo.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/ProcessTestAotMojo.java @@ -133,7 +133,7 @@ public class ProcessTestAotMojo extends AbstractAotMojo { } protected URL[] getClassPath(boolean includeJUnitPlatformLauncher) throws Exception { - URL[] classPath = getClassPath(this.classesDirectory); + URL[] classPath = getClassPath(this.classesDirectory, this.generatedClasses); if (!includeJUnitPlatformLauncher || this.project.getArtifactMap() .containsKey(JUNIT_PLATFORM_GROUP_ID + ":" + JUNIT_PLATFORM_LAUNCHER_ARTIFACT_ID)) { return classPath;