Skip to content

Commit e8aa568

Browse files
committed
Support file-based reachability metadata repositories
See gh-32408
1 parent 8323f24 commit e8aa568

File tree

13 files changed

+776
-3
lines changed

13 files changed

+776
-3
lines changed

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

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package org.springframework.boot.gradle.plugin;
1818

1919
import java.io.File;
20+
import java.net.URI;
2021
import java.nio.file.Path;
2122

2223
import org.graalvm.buildtools.gradle.NativeImagePlugin;
@@ -31,6 +32,7 @@
3132
import org.gradle.api.plugins.ExtensionAware;
3233
import org.gradle.api.plugins.JavaPlugin;
3334
import org.gradle.api.plugins.JavaPluginExtension;
35+
import org.gradle.api.provider.Property;
3436
import org.gradle.api.tasks.SourceSet;
3537
import org.gradle.api.tasks.SourceSetContainer;
3638

@@ -87,17 +89,24 @@ private void configureGraalVmReachabilityExtension(GraalVMExtension graalVmExten
8789
private void copyReachabilityMetadataToBootJar(Project project, GraalVMExtension graalVmExtension) {
8890
Path repositoryCacheDir = new File(project.getGradle().getGradleUserHomeDir(),
8991
"native-build-tools/repositories").toPath();
92+
9093
project.getTasks().named(SpringBootPlugin.BOOT_JAR_TASK_NAME, BootJar.class).configure((bootJar) -> {
9194
NativeImageOptions options = graalVmExtension.getBinaries().named(NativeImagePlugin.NATIVE_MAIN_EXTENSION)
9295
.get();
96+
GraalVMReachabilityMetadataRepositoryExtension metadataRepositoryExtension = ((ExtensionAware) graalVmExtension)
97+
.getExtensions().getByType(GraalVMReachabilityMetadataRepositoryExtension.class);
98+
Property<URI> metadataRepositoryUri = metadataRepositoryExtension.getUri();
9399
bootJar.from(options.getConfigurationFileDirectories())
94-
.eachFile((file) -> normalizePathIfNecessary(repositoryCacheDir, file));
100+
.eachFile((file) -> normalizePathIfNecessary(repositoryCacheDir, metadataRepositoryUri, file));
95101
});
96102
}
97103

98-
private void normalizePathIfNecessary(Path repositoryCacheDir, FileCopyDetails configurationFile) {
104+
private void normalizePathIfNecessary(Path repositoryCacheDir, Property<URI> metadataRepositoryUri,
105+
FileCopyDetails configurationFile) {
99106
Path configurationFilePath = configurationFile.getFile().toPath();
100-
if (configurationFilePath.startsWith(repositoryCacheDir)) {
107+
Path repositoryMetadataRoot = ("file".equals(metadataRepositoryUri.get().getScheme()))
108+
? Path.of(metadataRepositoryUri.get()) : repositoryCacheDir;
109+
if (configurationFilePath.startsWith(repositoryMetadataRoot)) {
101110
Path versionDir = configurationFilePath.getParent();
102111
Path artifactDir = versionDir.getParent();
103112
Path groupDir = artifactDir.getParent();

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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232

3333
import org.springframework.boot.gradle.junit.GradleCompatibility;
3434
import org.springframework.boot.testsupport.gradle.testkit.GradleBuild;
35+
import org.springframework.util.FileSystemUtils;
3536

3637
import static org.assertj.core.api.Assertions.assertThat;
3738

@@ -68,6 +69,24 @@ void reachabilityMetadataConfigurationFilesAreCopiedToJar() throws IOException {
6869
"META-INF/native-image/org.jline/jline/3.21.0/resource-config.json");
6970
}
7071

72+
@TestTemplate
73+
void reachabilityMetadataConfigurationFilesFromFileRepositoryAreCopiedToJar() throws IOException {
74+
writeDummyAotProcessorMainClass();
75+
FileSystemUtils.copyRecursively(new File("src/test/resources/reachability-metadata-repository"),
76+
new File(this.gradleBuild.getProjectDir(), "reachability-metadata-repository"));
77+
BuildResult result = this.gradleBuild.build("bootJar");
78+
assertThat(result.task(":bootJar").getOutcome()).isEqualTo(TaskOutcome.SUCCESS);
79+
File buildLibs = new File(this.gradleBuild.getProjectDir(), "build/libs");
80+
File jarFile = new File(buildLibs, this.gradleBuild.getProjectDir().getName() + ".jar");
81+
assertThat(buildLibs.listFiles()).contains(jarFile);
82+
assertThat(getEntryNames(jarFile)).contains(
83+
"META-INF/native-image/ch.qos.logback/logback-classic/1.2.11/reflect-config.json",
84+
"META-INF/native-image/org.jline/jline/3.21.0/jni-config.json",
85+
"META-INF/native-image/org.jline/jline/3.21.0/proxy-config.json",
86+
"META-INF/native-image/org.jline/jline/3.21.0/reflect-config.json",
87+
"META-INF/native-image/org.jline/jline/3.21.0/resource-config.json");
88+
}
89+
7190
private void writeDummyAotProcessorMainClass() {
7291
File examplePackage = new File(this.gradleBuild.getProjectDir(), "src/main/java/org/springframework/boot");
7392
examplePackage.mkdirs();
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
plugins {
2+
id 'java'
3+
id 'org.springframework.boot'
4+
id 'org.springframework.boot.aot'
5+
}
6+
7+
apply plugin: 'org.graalvm.buildtools.native'
8+
9+
repositories {
10+
mavenCentral()
11+
}
12+
13+
dependencies {
14+
implementation "ch.qos.logback:logback-classic:1.2.11"
15+
implementation "org.jline:jline:3.21.0"
16+
}
17+
18+
graalvmNative {
19+
metadataRepository {
20+
uri(file("reachability-metadata-repository"))
21+
}
22+
// see https://github.com/graalvm/native-build-tools/issues/302
23+
agent {
24+
tasksToInstrumentPredicate = { t -> false } as java.util.function.Predicate<Test>
25+
}
26+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
[
2+
"reflect-config.json"
3+
]

0 commit comments

Comments
 (0)