From 2d5a3eac51e728f8c03ec41030093819788e82cb Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Fri, 4 Nov 2022 11:53:33 +0000 Subject: [PATCH] Include AOT-generated classes in native test binary Closes gh-32940 --- .../gradle/plugin/NativeImagePluginAction.java | 13 ++++++------- ...ativeImagePluginActionIntegrationTests.java | 18 ++++++++++++++++++ ...ocessingAreOnTheNativeImageClasspath.gradle | 16 ++++++++++++++++ ...singAreOnTheTestNativeImageClasspath.gradle | 16 ++++++++++++++++ 4 files changed, 56 insertions(+), 7 deletions(-) create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/plugin/NativeImagePluginActionIntegrationTests-classesGeneratedDuringAotProcessingAreOnTheNativeImageClasspath.gradle create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/plugin/NativeImagePluginActionIntegrationTests-classesGeneratedDuringAotTestProcessingAreOnTheTestNativeImageClasspath.gradle 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 2346dca9e6..4d5ee8af39 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 @@ -32,7 +32,6 @@ import org.gradle.api.plugins.ExtensionAware; import org.gradle.api.plugins.JavaPlugin; import org.gradle.api.plugins.JavaPluginExtension; import org.gradle.api.tasks.SourceSetContainer; -import org.gradle.api.tasks.SourceSetOutput; import org.springframework.boot.gradle.tasks.bundling.BootBuildImage; import org.springframework.boot.gradle.tasks.bundling.BootJar; @@ -60,8 +59,7 @@ class NativeImagePluginAction implements PluginApplicationAction { SourceSetContainer sourceSets = javaPluginExtension.getSourceSets(); GraalVMExtension graalVmExtension = configureGraalVmExtension(project); configureMainNativeBinaryClasspath(project, sourceSets, graalVmExtension); - configureTestNativeBinaryClasspath(sourceSets, graalVmExtension, - SpringBootAotPlugin.AOT_TEST_SOURCE_SET_NAME); + configureTestNativeBinaryClasspath(project, sourceSets, graalVmExtension); configureGraalVmReachabilityExtension(graalVmExtension); copyReachabilityMetadataToBootJar(project); configureBootBuildImageToProduceANativeImage(project); @@ -86,10 +84,11 @@ class NativeImagePluginAction implements PluginApplicationAction { return !SpringBootPlugin.DEVELOPMENT_ONLY_CONFIGURATION_NAME.equals(configuration.getName()); } - private void configureTestNativeBinaryClasspath(SourceSetContainer sourceSets, GraalVMExtension graalVmExtension, - String sourceSetName) { - SourceSetOutput output = sourceSets.getByName(SpringBootAotPlugin.AOT_TEST_SOURCE_SET_NAME).getOutput(); - graalVmExtension.getBinaries().getByName(NativeImagePlugin.NATIVE_TEST_EXTENSION).classpath(output); + private void configureTestNativeBinaryClasspath(Project project, SourceSetContainer sourceSets, + GraalVMExtension graalVmExtension) { + FileCollection runtimeClasspath = sourceSets.getByName(SpringBootAotPlugin.AOT_TEST_SOURCE_SET_NAME) + .getRuntimeClasspath(); + graalVmExtension.getBinaries().getByName(NativeImagePlugin.NATIVE_TEST_EXTENSION).classpath(runtimeClasspath); } private GraalVMExtension configureGraalVmExtension(Project project) { diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/plugin/NativeImagePluginActionIntegrationTests.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/plugin/NativeImagePluginActionIntegrationTests.java index 31fa2f34e0..c045124dfe 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/plugin/NativeImagePluginActionIntegrationTests.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/plugin/NativeImagePluginActionIntegrationTests.java @@ -101,6 +101,24 @@ class NativeImagePluginActionIntegrationTests { assertThat(result.getOutput()).doesNotContain("commons-lang"); } + @TestTemplate + void classesGeneratedDuringAotProcessingAreOnTheNativeImageClasspath() { + BuildResult result = this.gradleBuild.build("checkNativeImageClasspath"); + assertThat(result.getOutput()).contains(projectPath("build/classes/java/aot"), + projectPath("build/resources/aot"), projectPath("build/generated/aotClasses")); + } + + @TestTemplate + void classesGeneratedDuringAotTestProcessingAreOnTheTestNativeImageClasspath() { + BuildResult result = this.gradleBuild.build("checkTestNativeImageClasspath"); + assertThat(result.getOutput()).contains(projectPath("build/classes/java/aotTest"), + projectPath("build/resources/aotTest"), projectPath("build/generated/aotTestClasses")); + } + + private String projectPath(String path) { + return new File(this.gradleBuild.getProjectDir(), path).getAbsolutePath(); + } + private void writeDummySpringApplicationAotProcessorMainClass() { File examplePackage = new File(this.gradleBuild.getProjectDir(), "src/main/java/org/springframework/boot"); examplePackage.mkdirs(); diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/plugin/NativeImagePluginActionIntegrationTests-classesGeneratedDuringAotProcessingAreOnTheNativeImageClasspath.gradle b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/plugin/NativeImagePluginActionIntegrationTests-classesGeneratedDuringAotProcessingAreOnTheNativeImageClasspath.gradle new file mode 100644 index 0000000000..17547ea5a0 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/plugin/NativeImagePluginActionIntegrationTests-classesGeneratedDuringAotProcessingAreOnTheNativeImageClasspath.gradle @@ -0,0 +1,16 @@ +plugins { + id 'org.springframework.boot' version '{version}' + id 'java' +} + +apply plugin: 'org.graalvm.buildtools.native' + +repositories { + mavenCentral() +} + +task('checkNativeImageClasspath') { + doFirst { + tasks.nativeCompile.options.get().classpath.each { println it } + } +} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/plugin/NativeImagePluginActionIntegrationTests-classesGeneratedDuringAotTestProcessingAreOnTheTestNativeImageClasspath.gradle b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/plugin/NativeImagePluginActionIntegrationTests-classesGeneratedDuringAotTestProcessingAreOnTheTestNativeImageClasspath.gradle new file mode 100644 index 0000000000..c5f4a743f2 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/plugin/NativeImagePluginActionIntegrationTests-classesGeneratedDuringAotTestProcessingAreOnTheTestNativeImageClasspath.gradle @@ -0,0 +1,16 @@ +plugins { + id 'org.springframework.boot' version '{version}' + id 'java' +} + +apply plugin: 'org.graalvm.buildtools.native' + +repositories { + mavenCentral() +} + +task('checkTestNativeImageClasspath') { + doFirst { + tasks.nativeTestCompile.options.get().classpath.each { println it } + } +}