Skip to content

Commit 9e6259c

Browse files
committed
Remove development-only dependencies from native image classpath
Fixes gh-32843
1 parent b0b2818 commit 9e6259c

File tree

3 files changed

+52
-7
lines changed

3 files changed

+52
-7
lines changed

spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/NativeImagePluginAction.java

+25-7
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,17 @@
1616

1717
package org.springframework.boot.gradle.plugin;
1818

19+
import java.util.LinkedHashSet;
20+
import java.util.Set;
21+
import java.util.stream.Collectors;
22+
1923
import org.graalvm.buildtools.gradle.NativeImagePlugin;
2024
import org.graalvm.buildtools.gradle.dsl.GraalVMExtension;
2125
import org.graalvm.buildtools.gradle.dsl.GraalVMReachabilityMetadataRepositoryExtension;
2226
import org.gradle.api.Action;
2327
import org.gradle.api.Plugin;
2428
import org.gradle.api.Project;
29+
import org.gradle.api.artifacts.Configuration;
2530
import org.gradle.api.plugins.ExtensionAware;
2631
import org.gradle.api.plugins.JavaPlugin;
2732
import org.gradle.api.plugins.JavaPluginExtension;
@@ -53,20 +58,33 @@ public void execute(Project project) {
5358
JavaPluginExtension javaPluginExtension = project.getExtensions().getByType(JavaPluginExtension.class);
5459
SourceSetContainer sourceSets = javaPluginExtension.getSourceSets();
5560
GraalVMExtension graalVmExtension = configureGraalVmExtension(project);
56-
configureNativeBinaryClasspath(sourceSets, graalVmExtension, NativeImagePlugin.NATIVE_MAIN_EXTENSION,
57-
SpringBootAotPlugin.AOT_SOURCE_SET_NAME);
58-
configureNativeBinaryClasspath(sourceSets, graalVmExtension, NativeImagePlugin.NATIVE_TEST_EXTENSION,
61+
configureMainNativeBinaryClasspath(project, sourceSets, graalVmExtension);
62+
configureTestNativeBinaryClasspath(sourceSets, graalVmExtension,
5963
SpringBootAotPlugin.AOT_TEST_SOURCE_SET_NAME);
6064
configureGraalVmReachabilityExtension(graalVmExtension);
6165
copyReachabilityMetadataToBootJar(project);
6266
configureBootBuildImageToProduceANativeImage(project);
6367
});
6468
}
6569

66-
private void configureNativeBinaryClasspath(SourceSetContainer sourceSets, GraalVMExtension graalVmExtension,
67-
String binaryName, String sourceSetName) {
68-
SourceSetOutput output = sourceSets.getByName(sourceSetName).getOutput();
69-
graalVmExtension.getBinaries().getByName(binaryName).classpath(output);
70+
private void configureMainNativeBinaryClasspath(Project project, SourceSetContainer sourceSets,
71+
GraalVMExtension graalVmExtension) {
72+
SourceSetOutput output = sourceSets.getByName(SpringBootAotPlugin.AOT_SOURCE_SET_NAME).getOutput();
73+
graalVmExtension.getBinaries().getByName(NativeImagePlugin.NATIVE_MAIN_EXTENSION).classpath(output);
74+
Configuration nativeImageClasspath = project.getConfigurations().getByName("nativeImageClasspath");
75+
nativeImageClasspath.setExtendsFrom(removeDevelopmentOnly(nativeImageClasspath.getExtendsFrom()));
76+
}
77+
78+
private Iterable<Configuration> removeDevelopmentOnly(Set<Configuration> configurations) {
79+
return configurations.stream().filter((
80+
configuration) -> !SpringBootPlugin.DEVELOPMENT_ONLY_CONFIGURATION_NAME.equals(configuration.getName()))
81+
.collect(Collectors.toCollection(LinkedHashSet::new));
82+
}
83+
84+
private void configureTestNativeBinaryClasspath(SourceSetContainer sourceSets, GraalVMExtension graalVmExtension,
85+
String sourceSetName) {
86+
SourceSetOutput output = sourceSets.getByName(SpringBootAotPlugin.AOT_TEST_SOURCE_SET_NAME).getOutput();
87+
graalVmExtension.getBinaries().getByName(NativeImagePlugin.NATIVE_TEST_EXTENSION).classpath(output);
7088
}
7189

7290
private GraalVMExtension configureGraalVmExtension(Project project) {

spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/plugin/NativeImagePluginActionIntegrationTests.java

+7
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,13 @@ void bootBuildImageIsConfiguredToBuildANativeImage() {
9494
assertThat(result.getOutput()).contains("paketobuildpacks/builder:tiny").contains("BP_NATIVE_IMAGE = true");
9595
}
9696

97+
@TestTemplate
98+
void developmentOnlyDependenciesDoNotAppearInNativeImageClasspath() {
99+
writeDummySpringApplicationAotProcessorMainClass();
100+
BuildResult result = this.gradleBuild.build("checkNativeImageClasspath");
101+
assertThat(result.getOutput()).doesNotContain("commons-lang");
102+
}
103+
97104
private void writeDummySpringApplicationAotProcessorMainClass() {
98105
File examplePackage = new File(this.gradleBuild.getProjectDir(), "src/main/java/org/springframework/boot");
99106
examplePackage.mkdirs();
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
plugins {
2+
id 'org.springframework.boot' version '{version}'
3+
id 'java'
4+
}
5+
6+
apply plugin: 'org.graalvm.buildtools.native'
7+
8+
repositories {
9+
mavenCentral()
10+
}
11+
12+
dependencies {
13+
developmentOnly("org.apache.commons:commons-lang3:3.12.0")
14+
}
15+
16+
task('checkNativeImageClasspath') {
17+
doFirst {
18+
tasks.nativeCompile.options.get().classpath.each { println it }
19+
}
20+
}

0 commit comments

Comments
 (0)