From c4beca3e0105581ba58753d2643814d3ded10088 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Wed, 18 May 2022 10:33:12 +0100 Subject: [PATCH] Fix Maven-based AOT generation on Windows Closes gh-30525 --- .../boot/maven/AotGenerateTests.java | 32 +++++++++++-------- .../boot/maven/AotGenerateMojo.java | 13 ++++---- 2 files changed, 24 insertions(+), 21 deletions(-) diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/java/org/springframework/boot/maven/AotGenerateTests.java b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/java/org/springframework/boot/maven/AotGenerateTests.java index ffe0d91e26..d5fe910076 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/java/org/springframework/boot/maven/AotGenerateTests.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/java/org/springframework/boot/maven/AotGenerateTests.java @@ -30,6 +30,7 @@ import static org.assertj.core.api.Assertions.assertThat; * Integration tests for the Maven plugin's AOT support. * * @author Stephane Nicoll + * @author Andy Wilkinson */ @ExtendWith(MavenBuildExtension.class) public class AotGenerateTests { @@ -38,12 +39,15 @@ public class AotGenerateTests { void whenAotRunsSourcesAreGenerated(MavenBuild mavenBuild) { mavenBuild.project("aot").goals("package").execute((project) -> { Path aotDirectory = project.toPath().resolve("target/spring-aot/main"); - assertThat(collectRelativeFileNames(aotDirectory.resolve("sources"))) - .contains("org/test/SampleApplication__ApplicationContextInitializer.java"); - assertThat(collectRelativeFileNames(aotDirectory.resolve("resources"))).containsOnly( - "META-INF/native-image/org.springframework.boot.maven.it/aot/reflect-config.json", - "META-INF/native-image/org.springframework.boot.maven.it/aot/resource-config.json", - "META-INF/native-image/org.springframework.boot.maven.it/aot/native-image.properties"); + assertThat(collectRelativePaths(aotDirectory.resolve("sources"))) + .contains(Path.of("org", "test", "SampleApplication__ApplicationContextInitializer.java")); + assertThat(collectRelativePaths(aotDirectory.resolve("resources"))).containsOnly( + Path.of("META-INF", "native-image", "org.springframework.boot.maven.it", "aot", + "reflect-config.json"), + Path.of("META-INF", "native-image", "org.springframework.boot.maven.it", "aot", + "resource-config.json"), + Path.of("META-INF", "native-image", "org.springframework.boot.maven.it", "aot", + "native-image.properties")); }); } @@ -51,8 +55,8 @@ public class AotGenerateTests { void whenAotRunsSourcesAreCompiled(MavenBuild mavenBuild) { mavenBuild.project("aot").goals("package").execute((project) -> { Path classesDirectory = project.toPath().resolve("target/classes"); - assertThat(collectRelativeFileNames(classesDirectory)) - .contains("org/test/SampleApplication__ApplicationContextInitializer.class"); + assertThat(collectRelativePaths(classesDirectory)) + .contains(Path.of("org", "test", "SampleApplication__ApplicationContextInitializer.class")); }); } @@ -60,17 +64,17 @@ public class AotGenerateTests { void whenAotRunsResourcesAreCopiedToTargetClasses(MavenBuild mavenBuild) { mavenBuild.project("aot").goals("package").execute((project) -> { Path classesDirectory = project.toPath().resolve("target/classes/META-INF/native-image"); - assertThat(collectRelativeFileNames(classesDirectory)).contains( - "org.springframework.boot.maven.it/aot/reflect-config.json", - "org.springframework.boot.maven.it/aot/resource-config.json", - "org.springframework.boot.maven.it/aot/native-image.properties"); + assertThat(collectRelativePaths(classesDirectory)).contains( + Path.of("org.springframework.boot.maven.it", "aot", "reflect-config.json"), + Path.of("org.springframework.boot.maven.it", "aot", "resource-config.json"), + Path.of("org.springframework.boot.maven.it", "aot", "native-image.properties")); }); } - Stream collectRelativeFileNames(Path sourceDirectory) { + Stream collectRelativePaths(Path sourceDirectory) { try { return Files.walk(sourceDirectory).filter(Files::isRegularFile) - .map((path) -> path.subpath(sourceDirectory.getNameCount(), path.getNameCount()).toString()); + .map((path) -> path.subpath(sourceDirectory.getNameCount(), path.getNameCount())); } catch (IOException ex) { throw new IllegalStateException(ex); diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/AotGenerateMojo.java b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/AotGenerateMojo.java index 8b2f29755a..c670d9e6fc 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/AotGenerateMojo.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/AotGenerateMojo.java @@ -23,11 +23,9 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardCopyOption; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import java.util.Locale; import java.util.Map; -import java.util.stream.Collectors; import javax.tools.Diagnostic; import javax.tools.DiagnosticListener; @@ -83,7 +81,7 @@ public class AotGenerateMojo extends AbstractRunMojo { throws MojoExecutionException, MojoFailureException { try { generateAotAssets(workingDirectory, startClassName, environmentVariables); - compileSourceFiles(getClassPathUrls()); + compileSourceFiles(); copyNativeConfiguration(this.generatedResources.toPath()); } catch (Exception ex) { @@ -139,16 +137,17 @@ public class AotGenerateMojo extends AbstractRunMojo { } } - private void compileSourceFiles(URL[] classpathUrls) throws IOException { + private void compileSourceFiles() throws IOException, MojoExecutionException { List sourceFiles = Files.walk(this.generatedSources.toPath()).filter(Files::isRegularFile).toList(); if (sourceFiles.isEmpty()) { return; } JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); try (StandardJavaFileManager fm = compiler.getStandardFileManager(null, null, null)) { - List options = List.of("-cp", - Arrays.stream(classpathUrls).map(URL::toString).collect(Collectors.joining(File.pathSeparator)), - "-d", this.classesDirectory.toPath().toAbsolutePath().toString()); + List options = new ArrayList<>(); + addClasspath(options); + options.add("-d"); + options.add(this.classesDirectory.toPath().toAbsolutePath().toString()); Iterable compilationUnits = fm.getJavaFileObjectsFromPaths(sourceFiles); Errors errors = new Errors(); CompilationTask task = compiler.getTask(null, fm, errors, options, null, compilationUnits);