Include AOT-generated classes in native test binary

Closes gh-32940
This commit is contained in:
Andy Wilkinson 2022-11-04 11:53:33 +00:00
parent 2b29a10d5b
commit 2d5a3eac51
4 changed files with 56 additions and 7 deletions

View File

@ -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) {

View File

@ -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();

View File

@ -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 }
}
}

View File

@ -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 }
}
}