From ce444fa2c9b73391649e667905e4e1edd63dc44b Mon Sep 17 00:00:00 2001 From: Mike Friesen Date: Tue, 10 Jun 2025 20:08:37 -0500 Subject: [PATCH 1/3] update version --- build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 8d4653b..2981c2f 100644 --- a/build.gradle +++ b/build.gradle @@ -10,7 +10,7 @@ plugins { } group 'com.formkiq.gradle' -version '1.7.0' +version '1.7.1' spotless { java { @@ -56,7 +56,7 @@ spotbugsMain { spotless { java { - eclipse().configFile project.rootProject.file("spotless.eclipseformat.xml") + eclipse().configFile rootProject.file("spotless.eclipseformat.xml") } } From 84eda4af4fe2fdd28a9bdfac6738c0de07de1e4b Mon Sep 17 00:00:00 2001 From: Mike Friesen Date: Tue, 10 Jun 2025 20:08:44 -0500 Subject: [PATCH 2/3] Fixed to throw an error when cannot download image --- src/main/java/com/formkiq/gradle/internal/Downloader.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/com/formkiq/gradle/internal/Downloader.java b/src/main/java/com/formkiq/gradle/internal/Downloader.java index 7c6bd8d..2a47453 100644 --- a/src/main/java/com/formkiq/gradle/internal/Downloader.java +++ b/src/main/java/com/formkiq/gradle/internal/Downloader.java @@ -14,6 +14,7 @@ */ package com.formkiq.gradle.internal; +import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; @@ -42,11 +43,13 @@ public class Downloader { */ public void download(final Collection urls, final Path toFile) throws IOException { + boolean found = false; if (!toFile.toFile().exists()) { for (final String url : urls) { if (urlExists(url)) { + found = true; LOGGER.log(Level.INFO, "Downloading " + url + " to " + toFile); Path parent = toFile.getParent(); if (parent != null) { @@ -71,6 +74,10 @@ public void download(final Collection urls, final Path toFile) throws IO } else { LOGGER.log(Level.INFO, "Downloaded file {0} already exists", toFile); } + + if (!found) { + throw new FileNotFoundException("Failed to download file from urls " + urls); + } } /** From 76eb62dddac4764d9cde4163788dcde3e8c63614 Mon Sep 17 00:00:00 2001 From: Mike Friesen Date: Tue, 10 Jun 2025 20:09:13 -0500 Subject: [PATCH 3/3] Fixed allowing multiple values in buildOption --- .../gradle/GraalvmParameterToStrings.java | 7 +- .../gradle/internal/NativeImageExecutor.java | 14 ++-- .../gradle/GraalvmParameterToStringsTest.java | 2 +- .../internal/NativeImageExecutorTest.java | 81 +++++++++++++++++++ 4 files changed, 95 insertions(+), 9 deletions(-) create mode 100644 src/test/java/com/formkiq/gradle/internal/NativeImageExecutorTest.java diff --git a/src/main/java/com/formkiq/gradle/GraalvmParameterToStrings.java b/src/main/java/com/formkiq/gradle/GraalvmParameterToStrings.java index 1c7bc67..0fc347b 100644 --- a/src/main/java/com/formkiq/gradle/GraalvmParameterToStrings.java +++ b/src/main/java/com/formkiq/gradle/GraalvmParameterToStrings.java @@ -14,7 +14,12 @@ public List apply(final GraalvmNativeExtension extension) { List args = new ArrayList<>(); if (extension.getBuildOptions() != null) { - args.add(extension.getBuildOptions()); + String[] split = extension.getBuildOptions().split("-"); + for (String s : split) { + if (!s.isEmpty()) { + args.add("-" + s.trim()); + } + } } addBooleanArgument(args, extension.isEnableFallback(), "--no-fallback"); diff --git a/src/main/java/com/formkiq/gradle/internal/NativeImageExecutor.java b/src/main/java/com/formkiq/gradle/internal/NativeImageExecutor.java index c0d3513..0401bc1 100644 --- a/src/main/java/com/formkiq/gradle/internal/NativeImageExecutor.java +++ b/src/main/java/com/formkiq/gradle/internal/NativeImageExecutor.java @@ -84,15 +84,15 @@ public void buildGraalvmJavaMain(final Project project, final Path buildDir) { new RuntimeDependenciesDecompress(project).apply(buildDir); } - private List getBuildGraalvmImageArguments(final Project project, final Path buildDir) { + List getBuildGraalvmImageArguments(final Project project, final Path buildDir) { - List args = new ArrayList<>(); - args.add("--report-unsupported-elements-at-runtime"); - args.add("--no-server"); + List args = new ArrayList<>(new GraalvmParameterToStrings().apply(this.extension)); - args.addAll(new GraalvmParameterToStrings().apply(this.extension)); + String executableName = this.extension.getOutputFileName(); - args.add("-H:Name=" + getExecutableName(project)); + if (executableName != null) { + args.add("-H:Name=" + getExecutableName(project)); + } args.addAll(new GraalvmClasspathArguments(buildDir).apply(this.extension)); @@ -123,7 +123,7 @@ public void runGuInstallation(final ExecOperations execOperations, final Path gr throws IOException { String guExecutable = OperatingSystem.current().isWindows() ? "gu.cmd" : "gu"; - Path gu = graalvmBaseDir.resolve(guExecutable); + Path gu = getGraalBin(graalvmBaseDir.toFile()).resolve(guExecutable); if (gu.toFile().exists()) { execOperations.exec(arg0 -> { diff --git a/src/test/java/com/formkiq/gradle/GraalvmParameterToStringsTest.java b/src/test/java/com/formkiq/gradle/GraalvmParameterToStringsTest.java index 63724c1..8142fd2 100644 --- a/src/test/java/com/formkiq/gradle/GraalvmParameterToStringsTest.java +++ b/src/test/java/com/formkiq/gradle/GraalvmParameterToStringsTest.java @@ -81,7 +81,7 @@ void testAllParametersSet() { // apply(...) List expected = List.of( // 1. buildOptions - "myBuildOptions", + "-myBuildOptions", // 2. boolean flags in declaration order "--no-fallback", "--allow-incomplete-classpath", "--install-exit-handlers", // disabled HTTP/HTTPS → do not appear diff --git a/src/test/java/com/formkiq/gradle/internal/NativeImageExecutorTest.java b/src/test/java/com/formkiq/gradle/internal/NativeImageExecutorTest.java new file mode 100644 index 0000000..ff2f300 --- /dev/null +++ b/src/test/java/com/formkiq/gradle/internal/NativeImageExecutorTest.java @@ -0,0 +1,81 @@ +package com.formkiq.gradle.internal; + +import static org.junit.jupiter.api.Assertions.*; + +import com.formkiq.gradle.GraalvmNativeExtension; +import java.nio.file.Path; +import java.util.List; +import org.gradle.api.Project; +import org.gradle.testfixtures.ProjectBuilder; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +class NativeImageExecutorNoMockTest { + + private Project project; + private Path fakeBuildDir; + + @BeforeEach + void setUp() { + project = ProjectBuilder.builder().build(); + fakeBuildDir = Path.of("build", "dummy"); + } + + /** With output filename set. */ + @Test + void testGetBuildGraalvmImageArguments01() { + // given + GraalvmNativeExtension extension = new GraalvmNativeExtension(project.getObjects()); + extension.setOutputFileName("my-app"); + extension.setMainClassName("com.example.Main"); + + NativeImageExecutor executor = new NativeImageExecutor(extension); + + // when + List args = executor.getBuildGraalvmImageArguments(project, fakeBuildDir); + + // then + assertTrue(args.stream().anyMatch(a -> a.equals("-H:Name=my-app")), + () -> "Expected '-H:Name=my-app' in " + args); + assertEquals("com.example.Main", args.get(args.size() - 1)); + } + + /** Without output filename set. */ + @Test + void testGetBuildGraalvmImageArguments02() { + // given + GraalvmNativeExtension extension = new GraalvmNativeExtension(project.getObjects()); + extension.setMainClassName("com.example.Main"); + NativeImageExecutor executor = new NativeImageExecutor(extension); + + // when + List args = executor.getBuildGraalvmImageArguments(project, fakeBuildDir); + + // then + assertTrue(args.stream().noneMatch(a -> a.startsWith("-H:Name=")), + () -> "Did not expect any '-H:Name=' flag in " + args); + assertEquals("com.example.Main", args.get(args.size() - 1)); + } + + /** With multiple build options. */ + @Test + void testGetBuildGraalvmImageArguments03() { + // given + GraalvmNativeExtension extension = new GraalvmNativeExtension(project.getObjects()); + extension.setBuildOptions("-Os -o fk"); + extension.setMainClassName("com.example.Main"); + NativeImageExecutor executor = new NativeImageExecutor(extension); + + // when + List args = executor.getBuildGraalvmImageArguments(project, fakeBuildDir); + + // then + final int expected = 7; + int i = 0; + assertEquals(expected, args.size()); + assertEquals("-Os", args.get(i++)); + assertEquals("-o fk", args.get(i++)); + assertEquals("--enable-http", args.get(i++)); + assertEquals("--enable-https", args.get(i)); + } +}