From 7d6f96f3a88a61fe17f84205c0e9a99738f29838 Mon Sep 17 00:00:00 2001 From: Mike Friesen Date: Fri, 19 Dec 2025 21:36:07 -0600 Subject: [PATCH 1/5] Fixed reusing downloaded graalvm image --- src/main/java/com/formkiq/gradle/internal/Downloader.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/formkiq/gradle/internal/Downloader.java b/src/main/java/com/formkiq/gradle/internal/Downloader.java index 2a47453..b4e9a6f 100644 --- a/src/main/java/com/formkiq/gradle/internal/Downloader.java +++ b/src/main/java/com/formkiq/gradle/internal/Downloader.java @@ -71,13 +71,13 @@ public void download(final Collection urls, final Path toFile) throws IO } } + if (!found) { + throw new FileNotFoundException("Failed to download file from urls " + urls); + } + } else { LOGGER.log(Level.INFO, "Downloaded file {0} already exists", toFile); } - - if (!found) { - throw new FileNotFoundException("Failed to download file from urls " + urls); - } } /** From 183f2e6732eea35fc7c911f0619ef9fc699cfd44 Mon Sep 17 00:00:00 2001 From: Mike Friesen Date: Fri, 19 Dec 2025 21:36:59 -0600 Subject: [PATCH 2/5] Fixed gradle caching when changing parameters --- .../formkiq/gradle/GraalvmNativePlugin.java | 36 ---------- .../com/formkiq/gradle/GraalvmNativeTask.java | 66 +++++++++++++++++++ 2 files changed, 66 insertions(+), 36 deletions(-) diff --git a/src/main/java/com/formkiq/gradle/GraalvmNativePlugin.java b/src/main/java/com/formkiq/gradle/GraalvmNativePlugin.java index ceb347e..4447cf6 100644 --- a/src/main/java/com/formkiq/gradle/GraalvmNativePlugin.java +++ b/src/main/java/com/formkiq/gradle/GraalvmNativePlugin.java @@ -77,41 +77,5 @@ public void apply(final Project project) { project.getPlugins().withId("distribution", __ -> project.getTasks().named("distZip").configure(t -> t.dependsOn(nativeImage))); }); - - // TaskProvider nativeImage = - // project.getTasks().register("graalvmNativeImage", GraalvmNativeTask.class, task -> { - // task.setGroup("Graalvm"); - // task.setDescription("Build GraalVM Native Image"); - // task.setExtension(ext); - // task.usesService(svc); - // task.onlyIf(t -> ext.getMainClassName().isPresent()); - // - // task.getBuildDirectory().set(project.getLayout().getBuildDirectory().dir("graalvm")); - // }); - // - // project.getPlugins().withType(JavaPlugin.class, jp -> { - // SourceSetContainer sourceSets = - // project.getExtensions().getByType(SourceSetContainer.class); - // SourceSet main = sourceSets.getByName(SourceSet.MAIN_SOURCE_SET_NAME); - // - // // Inputs - // nativeImage.configure(t -> { - // t.getSources().from(main.getAllSource()); // sources (java + resources) - // t.getRuntimeClasspath().from(main.getRuntimeClasspath()); // runtime jars/classes - // }); - // - // nativeImage.configure(t -> - // t.dependsOn(project.getTasks().named(JavaPlugin.JAR_TASK_NAME))); - // }); - // - // // Make assemble run AFTER native image (i.e., assemble depends on native) - // project.getTasks() - // .named(org.gradle.language.base.plugins.LifecycleBasePlugin.ASSEMBLE_TASK_NAME) - // .configure(t -> t.dependsOn(nativeImage)); - // - // // If using the Distribution plugin, make distZip run AFTER native image - // project.getPlugins().withId("distribution", p -> { - // project.getTasks().named("distZip").configure(t -> t.dependsOn(nativeImage)); - // }); } } diff --git a/src/main/java/com/formkiq/gradle/GraalvmNativeTask.java b/src/main/java/com/formkiq/gradle/GraalvmNativeTask.java index 7148f89..5f5333d 100644 --- a/src/main/java/com/formkiq/gradle/GraalvmNativeTask.java +++ b/src/main/java/com/formkiq/gradle/GraalvmNativeTask.java @@ -38,6 +38,7 @@ import org.gradle.api.resources.ResourceException; import org.gradle.api.tasks.CacheableTask; import org.gradle.api.tasks.Classpath; +import org.gradle.api.tasks.Input; import org.gradle.api.tasks.InputFiles; import org.gradle.api.tasks.OutputDirectory; import org.gradle.api.tasks.PathSensitive; @@ -77,6 +78,67 @@ public abstract class GraalvmNativeTask extends DefaultTask { @OutputDirectory public abstract DirectoryProperty getBuildDirectory(); + /** + * Extension configuration fingerprint for task caching. + * + * @return String + */ + @Input + public String getExtensionFingerprint() { + if (this.extension == null) { + return ""; + } + + StringBuilder sb = new StringBuilder(); + appendFingerprint(sb, "addClasspath", this.extension.getAddClasspath()); + appendFingerprint(sb, "buildOptions", this.extension.getBuildOptions()); + appendFingerprint(sb, "dockerFile", this.extension.getDockerFile()); + appendFingerprint(sb, "dockerImage", this.extension.getDockerImage()); + appendFingerprint(sb, "features", this.extension.getFeatures()); + appendFingerprint(sb, "imageFile", this.extension.getImageFile()); + appendFingerprint(sb, "imageVersion", this.extension.getImageVersion()); + appendFingerprint(sb, "initializeAtBuildTime", this.extension.getInitializeAtBuildTime()); + appendFingerprint(sb, "initializeAtRunTime", this.extension.getInitializeAtRunTime()); + appendFingerprint(sb, "javaVersion", this.extension.getJavaVersion()); + appendFingerprint(sb, "jniConfigurationFiles", this.extension.getJniConfigurationFiles()); + appendFingerprint(sb, "mainClassName", this.extension.getMainClassName().getOrNull()); + appendFingerprint(sb, "outputFileName", this.extension.getOutputFileName()); + appendFingerprint(sb, "outputImageTag", this.extension.getOutputImageTag()); + appendFingerprint(sb, "platform", this.extension.getPlatform()); + appendFingerprint(sb, "reflectionConfig", this.extension.getReflectionConfig()); + appendFingerprint(sb, "resourceConfigurationFiles", + this.extension.getResourceConfigurationFiles()); + appendFingerprint(sb, "serializationConfig", this.extension.getSerializationConfig()); + appendFingerprint(sb, "systemProperty", this.extension.getSystemProperty()); + appendFingerprint(sb, "traceClassInitialization", this.extension.getTraceClassInitialization()); + appendFingerprint(sb, "enableAddAllCharsets", this.extension.isEnableAddAllCharsets()); + appendFingerprint(sb, "enableAllowIncompleteClasspath", + this.extension.isAllowIncompleteClasspath()); + appendFingerprint(sb, "enableAllSecurityServices", + this.extension.isEnableAllSecurityServices()); + appendFingerprint(sb, "enableAutoFallback", this.extension.isEnableAutofallback()); + appendFingerprint(sb, "enableCheckToolchain", this.extension.isEnableCheckToolchain()); + appendFingerprint(sb, "enableForceFallback", this.extension.isEnableForceFallback()); + appendFingerprint(sb, "enableHttp", this.extension.isEnableHttp()); + appendFingerprint(sb, "enableHttps", this.extension.isEnableHttps()); + appendFingerprint(sb, "enableInstallExitHandlers", + this.extension.isEnableInstallExitHandlers()); + appendFingerprint(sb, "enableNoFallback", this.extension.isEnableFallback()); + appendFingerprint(sb, "enablePrintAnalysisCallTree", + this.extension.isEnablePrintAnalysisCallTree()); + appendFingerprint(sb, "enableRemoveSaturatedTypeFlows", + this.extension.isEnableRemoveSaturatedTypeFlows()); + appendFingerprint(sb, "enableReportExceptionStackTraces", + this.extension.isEnableReportExceptionStackTraces()); + appendFingerprint(sb, "enableReportUnsupportedElementsAtRuntime", + this.extension.isEnableReportUnsupportedElementsAtRuntime()); + appendFingerprint(sb, "enableShared", this.extension.isEnableShared()); + appendFingerprint(sb, "enableStatic", this.extension.isEnableStatic()); + appendFingerprint(sb, "enableVerbose", this.extension.isEnableVerbose()); + + return sb.toString(); + } + /** * Use {@link ExecOperations} instead of project.exec(...). * @@ -240,4 +302,8 @@ private String getFilenameExtension() { private String getFilename() { return MessageFormat.format("graalvm-ce.{0}", getFilenameExtension()); } + + private void appendFingerprint(final StringBuilder sb, final String key, final Object value) { + sb.append(key).append('=').append(String.valueOf(value)).append('\n'); + } } From 245de881947915063395f165fc6801643b5bc2f8 Mon Sep 17 00:00:00 2001 From: Mike Friesen Date: Fri, 19 Dec 2025 21:37:13 -0600 Subject: [PATCH 3/5] update version to 1.7.5 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 10365c9..9db9b17 100644 --- a/build.gradle +++ b/build.gradle @@ -10,7 +10,7 @@ plugins { } group 'com.formkiq.gradle' -version '1.7.4' +version '1.7.5' spotless { java { From 16d7eae96ececfd196b5a784484125f72c0606a2 Mon Sep 17 00:00:00 2001 From: Mike Friesen Date: Fri, 19 Dec 2025 21:37:29 -0600 Subject: [PATCH 4/5] Fix ImageFile parameter --- src/main/java/com/formkiq/gradle/GraalvmNativeTask.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/com/formkiq/gradle/GraalvmNativeTask.java b/src/main/java/com/formkiq/gradle/GraalvmNativeTask.java index 5f5333d..5239c52 100644 --- a/src/main/java/com/formkiq/gradle/GraalvmNativeTask.java +++ b/src/main/java/com/formkiq/gradle/GraalvmNativeTask.java @@ -191,6 +191,9 @@ public void createImage() { .withVersion(this.extension.getImageVersion()).withPlatform(Platform.detect()) .build(); downloader.download(urls, toFile); + + } else { + toFile = Path.of(this.extension.getImageFile()); } archiveUtils.decompress(toFile.toFile(), buildDirGraalvm.toFile()); From f0926fcd9ab6130a2536e6d8541e8070dc5fcde3 Mon Sep 17 00:00:00 2001 From: Mike Friesen Date: Fri, 19 Dec 2025 21:53:36 -0600 Subject: [PATCH 5/5] Fixed integration tests --- samples/aws-lambda/HelloWorldFunction/build.gradle | 4 +--- samples/dockerfile/build.gradle | 2 -- samples/helloworld/app/build.gradle | 4 +--- 3 files changed, 2 insertions(+), 8 deletions(-) diff --git a/samples/aws-lambda/HelloWorldFunction/build.gradle b/samples/aws-lambda/HelloWorldFunction/build.gradle index 75d6533..1eb58a0 100644 --- a/samples/aws-lambda/HelloWorldFunction/build.gradle +++ b/samples/aws-lambda/HelloWorldFunction/build.gradle @@ -1,7 +1,7 @@ plugins { id 'java-library' - id 'com.formkiq.gradle.graalvm-native-plugin' version '1.7.3' + id 'com.formkiq.gradle.graalvm-native-plugin' version '1.7.4' } repositories { @@ -30,5 +30,3 @@ nativeImage { enableStatic = true reflectionConfig = "META-INF/graal/reflect.json" } - -build.dependsOn graalvmNativeImage diff --git a/samples/dockerfile/build.gradle b/samples/dockerfile/build.gradle index 47ea26c..0a9294a 100644 --- a/samples/dockerfile/build.gradle +++ b/samples/dockerfile/build.gradle @@ -13,5 +13,3 @@ nativeImage { dockerFile = 'Dockerfile' outputImageTag = 'myimage' } - -build.dependsOn graalvmNativeImage diff --git a/samples/helloworld/app/build.gradle b/samples/helloworld/app/build.gradle index ec638c2..ef20a53 100644 --- a/samples/helloworld/app/build.gradle +++ b/samples/helloworld/app/build.gradle @@ -9,7 +9,7 @@ plugins { // Apply the application plugin to add support for building a CLI application in Java. id 'application' - id 'com.formkiq.gradle.graalvm-native-plugin' version '1.7.3' + id 'com.formkiq.gradle.graalvm-native-plugin' version '1.7.4' } sourceCompatibility = "11" @@ -39,5 +39,3 @@ nativeImage { } tasks.distTar.enabled = false -distZip.dependsOn graalvmNativeImage -startScripts.dependsOn graalvmNativeImage