From 7d3205e6d89da99fef732c7535a397f37a16f026 Mon Sep 17 00:00:00 2001 From: Mike Friesen Date: Sun, 14 Sep 2025 11:48:59 -0500 Subject: [PATCH 1/2] Fixed project building Lifecycle --- build.gradle | 2 +- config/gradle/spotbugs-exclude.xml | 9 +- .../gradle/GraalvmNativeExtension.java | 6 +- .../formkiq/gradle/GraalvmNativePlugin.java | 93 +++++++-- .../com/formkiq/gradle/GraalvmNativeTask.java | 182 +++++++----------- .../formkiq/gradle/internal/GradleUtils.java | 66 ------- .../gradle/internal/NativeImageExecutor.java | 18 +- .../gradle/services/DefaultDockerService.java | 2 +- .../gradle/services/DockerService.java | 2 +- .../RuntimeDependenciesDecompress.java | 36 ++-- .../gradle/services/ShellDockerService.java | 2 +- .../gradle/services/DockerServiceTests.java | 2 +- 12 files changed, 194 insertions(+), 226 deletions(-) delete mode 100644 src/main/java/com/formkiq/gradle/internal/GradleUtils.java diff --git a/build.gradle b/build.gradle index 247b448..5bba917 100644 --- a/build.gradle +++ b/build.gradle @@ -10,7 +10,7 @@ plugins { } group 'com.formkiq.gradle' -version '1.7.2' +version '1.7.3' spotless { java { diff --git a/config/gradle/spotbugs-exclude.xml b/config/gradle/spotbugs-exclude.xml index 865f84f..e4664d9 100644 --- a/config/gradle/spotbugs-exclude.xml +++ b/config/gradle/spotbugs-exclude.xml @@ -41,6 +41,13 @@ For a detailed description of spotbugs bug categories, see https://spotbugs.read + + + + + + + @@ -55,4 +62,4 @@ For a detailed description of spotbugs bug categories, see https://spotbugs.read - \ No newline at end of file + diff --git a/src/main/java/com/formkiq/gradle/GraalvmNativeExtension.java b/src/main/java/com/formkiq/gradle/GraalvmNativeExtension.java index 3e5503c..3ee82db 100644 --- a/src/main/java/com/formkiq/gradle/GraalvmNativeExtension.java +++ b/src/main/java/com/formkiq/gradle/GraalvmNativeExtension.java @@ -289,10 +289,10 @@ public String getJniConfigurationFiles() { /** * Get Main Class Name. * - * @return {@link String} + * @return {@link Property} {@link String} */ - public String getMainClassName() { - return this.mainClassName.get(); + public Property getMainClassName() { + return this.mainClassName; } /** diff --git a/src/main/java/com/formkiq/gradle/GraalvmNativePlugin.java b/src/main/java/com/formkiq/gradle/GraalvmNativePlugin.java index 2cc6452..ceb347e 100644 --- a/src/main/java/com/formkiq/gradle/GraalvmNativePlugin.java +++ b/src/main/java/com/formkiq/gradle/GraalvmNativePlugin.java @@ -16,7 +16,10 @@ import org.gradle.api.Plugin; import org.gradle.api.Project; +import org.gradle.api.plugins.JavaPlugin; import org.gradle.api.provider.Provider; +import org.gradle.api.tasks.SourceSet; +import org.gradle.api.tasks.SourceSetContainer; import org.gradle.api.tasks.TaskProvider; /** GraalVM Plugin to build a native-image from a Java application. */ @@ -31,22 +34,84 @@ public void apply(final Project project) { Provider svc = project.getGradle().getSharedServices().registerIfAbsent( "web", GraalvmBuildService.class, spec -> spec.getMaxParallelUsages().set(1)); - TaskProvider nativeImage = - project.getTasks().register("graalvmNativeImage", GraalvmNativeTask.class, task -> { - task.setGroup("Graalvm"); - task.setDescription("Build GraalVM Native Image"); - task.setExtension(ext); - task.usesService(svc); + project.afterEvaluate(p -> { + // Treat "configured" as: user set mainClassName (adjust the predicate if you prefer) + boolean configured = ext.getMainClassName().isPresent(); + + if (!configured) { + // User didn't declare nativeImage { ... } in this subproject — do nothing. + return; + } + + // Register the task now that we know it's wanted in this project + TaskProvider nativeImage = + project.getTasks().register("graalvmNativeImage", GraalvmNativeTask.class, task -> { + task.setGroup("Graalvm"); + task.setDescription("Build GraalVM Native Image"); + task.setExtension(ext); // inject the extension (nested inputs) + task.usesService(svc); + task.getBuildDirectory().set(project.getLayout().getBuildDirectory().dir("graalvm")); + }); + + // Wire only if the Java plugin is applied + 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()); // java + resources + t.getRuntimeClasspath().from(main.getRuntimeClasspath()); // runtime jars/classes }); - project.afterEvaluate(p -> nativeImage.configure(task -> { - // always depend on `check` - task.dependsOn("check"); + // Ensure producers run first (jar is enough; avoids assemble cycles) + nativeImage.configure(t -> t.dependsOn(project.getTasks().named(JavaPlugin.JAR_TASK_NAME))); + }); - // only depend on `jar` if that task was applied - if (p.getTasks().findByName("jar") != null) { - task.dependsOn("jar"); - } - })); + // If you want assemble to run AFTER native image in projects that opted in + project.getTasks() + .named(org.gradle.language.base.plugins.LifecycleBasePlugin.ASSEMBLE_TASK_NAME) + .configure(t -> t.dependsOn(nativeImage)); + + // If the Distribution plugin is applied, make distZip wait for native image + 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 c82a4ed..59b681b 100644 --- a/src/main/java/com/formkiq/gradle/GraalvmNativeTask.java +++ b/src/main/java/com/formkiq/gradle/GraalvmNativeTask.java @@ -33,14 +33,15 @@ import java.util.stream.Stream; import javax.inject.Inject; import org.gradle.api.DefaultTask; -import org.gradle.api.artifacts.ConfigurationContainer; import org.gradle.api.file.ConfigurableFileCollection; import org.gradle.api.file.DirectoryProperty; -import org.gradle.api.file.ProjectLayout; import org.gradle.api.resources.ResourceException; import org.gradle.api.tasks.Classpath; -import org.gradle.api.tasks.InputDirectory; +import org.gradle.api.tasks.InputFiles; import org.gradle.api.tasks.OutputDirectory; +import org.gradle.api.tasks.PathSensitive; +import org.gradle.api.tasks.PathSensitivity; +import org.gradle.api.tasks.SkipWhenEmpty; import org.gradle.api.tasks.TaskAction; import org.gradle.process.ExecOperations; @@ -48,35 +49,39 @@ public abstract class GraalvmNativeTask extends DefaultTask { /** - * The directory containing your main source set. + * Java + resources that influence the native image. * - * @return DirectoryProperty + * @return ConfigurableFileCollection */ - @InputDirectory - public abstract DirectoryProperty getSourceDir(); + @InputFiles + @SkipWhenEmpty + @PathSensitive(PathSensitivity.RELATIVE) + public abstract ConfigurableFileCollection getSources(); /** - * Get Runtime Classpath. + * Runtime classpath (jars/classes/resources) for native-image. * * @return ConfigurableFileCollection */ + @InputFiles @Classpath public abstract ConfigurableFileCollection getRuntimeClasspath(); /** - * Where we'll write out the native image. + * Output Directory binary. * * @return DirectoryProperty */ @OutputDirectory - public abstract DirectoryProperty getOutputDir(); - - private final ExecOperations execOperations; - private final Path buildDirectory; - private final Path projectDirectory; + public abstract DirectoryProperty getBuildDirectory(); - /** {@link GraalvmNativeExtension}. */ - private GraalvmNativeExtension extension; + /** + * Use {@link ExecOperations} instead of project.exec(...). + * + * @return ExecOperations + */ + @Inject + protected abstract ExecOperations getExecOperations(); /** {@link ArchiveUtils}, */ private final ArchiveUtils archiveUtils = new ArchiveUtils(); @@ -84,81 +89,71 @@ public abstract class GraalvmNativeTask extends DefaultTask { /** {@link Downloader}. */ private final Downloader downloader = new Downloader(); + // The extension with your ~20 inputs: + private GraalvmNativeExtension extension; + /** - * constructor. + * Set Extension. * - * @param layout {@link ProjectLayout} - * @param configurations {@link ConfigurationContainer} - * @param execOperations {@link ExecOperations} + * @param params {@link GraalvmNativeExtension} */ - @Inject - public GraalvmNativeTask(final ProjectLayout layout, final ConfigurationContainer configurations, - final ExecOperations execOperations) { - - this.execOperations = execOperations; - - if (Path.of("src/main/java").toFile().exists()) { - getSourceDir().set(layout.getProjectDirectory().dir("src/main/java")); - } else { - getSourceDir().set(layout.getProjectDirectory()); - } - - getRuntimeClasspath().from(configurations.named("runtimeClasspath")); - - getOutputDir().set(layout.getBuildDirectory().dir("graalvm")); - this.setGroup("build"); - this.setDescription("Builds a native image for Java applications using GraalVM tools"); - buildDirectory = layout.getBuildDirectory().get().getAsFile().toPath(); - projectDirectory = layout.getProjectDirectory().getAsFile().toPath(); + public void setExtension(final GraalvmNativeExtension params) { + this.extension = params; } /** Create GraalVM Image. */ @TaskAction public void createImage() { - try { + if (extension.getMainClassName() != null) { + try { - NativeImageExecutor executor = new NativeImageExecutor(this.extension); + NativeImageExecutor executor = new NativeImageExecutor(this.extension); - if (this.extension.getDockerFile() != null) { - executeDockerFile(); - } else if (this.extension.getDockerImage() != null) { + if (this.extension.getDockerFile() != null) { + executeDockerFile(); + } else if (this.extension.getDockerImage() != null) { - executeDockerImage(executor); + executeDockerImage(executor); - } else { + } else { - Path buildDirGraalvm = buildDirectory.resolve("graalvm"); - Path toFile = buildDirGraalvm.resolve(getFilename()); + Path buildDirGraalvm = getBuildDirectoryAsPath().resolve("graalvm"); + Path toFile = buildDirGraalvm.resolve(getFilename()); - if (this.extension.getImageFile() == null) { - List urls = - GraalVmUrlBuilder.builder().withJavaVersion(this.extension.getJavaVersion()) - .withVersion(this.extension.getImageVersion()).withPlatform(Platform.detect()) - .build(); - downloader.download(urls, toFile); - } + if (this.extension.getImageFile() == null) { + List urls = + GraalVmUrlBuilder.builder().withJavaVersion(this.extension.getJavaVersion()) + .withVersion(this.extension.getImageVersion()).withPlatform(Platform.detect()) + .build(); + downloader.download(urls, toFile); + } + + archiveUtils.decompress(toFile.toFile(), buildDirGraalvm.toFile()); - archiveUtils.decompress(toFile.toFile(), buildDirGraalvm.toFile()); + String folder = getFirstSubdirectory(buildDirGraalvm); + Path graalvmBaseDir = buildDirGraalvm.resolve(folder); - String folder = getFirstSubdirectory(buildDirGraalvm); - Path graalvmBaseDir = buildDirGraalvm.resolve(folder); + Path path = getBuildDirectoryAsPath().resolve("java/main"); + if (path.toFile().exists()) { + deleteDirectory(path); + } - Path path = buildDirectory.resolve("graalvm/java/main"); - if (path.toFile().exists()) { - deleteDirectory(path); + executor.runGuInstallation(getExecOperations(), graalvmBaseDir); + executor.runNativeImage(getExecOperations(), getProject(), getBuildDirectoryAsPath(), + graalvmBaseDir.toFile(), path.toFile(), getRuntimeClasspath()); } - executor.runGuInstallation(this.execOperations, graalvmBaseDir); - executor.runNativeImage(this.execOperations, getProject(), buildDirectory, - graalvmBaseDir.toFile(), path.toFile()); + } catch (IOException | InterruptedException e) { + throw new ResourceException(e.getMessage(), e); } - - } catch (IOException | InterruptedException e) { - throw new ResourceException(e.getMessage(), e); } } + private Path getBuildDirectoryAsPath() { + return getBuildDirectory().get().getAsFile().toPath(); + } + private void executeDockerFile() throws IOException, InterruptedException { DockerService service = new DefaultDockerService(); @@ -167,11 +162,12 @@ private void executeDockerFile() throws IOException, InterruptedException { } String dockerfileContent = Files.readString(Path.of(this.extension.getDockerFile())); - getLogger().info("Generating Dockerfile {}", dockerfileContent); + getLogger().info("Generating Dockerfile"); + getLogger().info("{}", dockerfileContent); service.removeDockerImage(this.extension.getOutputImageTag()); - Path buildDir = buildDirectory; + Path buildDir = getBuildDirectoryAsPath(); service.buildDockerImage(buildDir, this.extension.getOutputImageTag(), dockerfileContent); service.runDockerImage(buildDir, this.extension.getOutputImageTag()); } @@ -184,22 +180,24 @@ private void executeDockerImage(NativeImageExecutor executor) throw new ResourceException("Docker is not running"); } - executor.buildGraalvmJavaMain(getProject(), buildDirectory); + getRuntimeClasspath().forEach(path -> getLogger().info("FOUND PATH: " + path)); + executor.buildGraalvmJavaMain(getBuildDirectoryAsPath(), getRuntimeClasspath()); DockerfileGenerator.Builder builder = DockerfileGenerator.builder().baseImage(this.extension.getDockerImage()) - .addNativeImageArgs(this.extension).mainClass(this.extension.getMainClassName()); + .addNativeImageArgs(this.extension).mainClass(this.extension.getMainClassName().get()); if (this.extension.getOutputFileName() != null) { builder.addNativeImageArg("-H:Name=" + this.extension.getOutputFileName()); } - String dockerfileContent = builder.build().generateContents(buildDirectory); - getLogger().info("Generating Dockerfile {}", dockerfileContent); + String dockerfileContent = builder.build().generateContents(getBuildDirectoryAsPath()); + getLogger().info("Generating Dockerfile"); + getLogger().info("{}", dockerfileContent); service.removeDockerImage(this.extension.getOutputImageTag()); - Path buildDir = buildDirectory; + Path buildDir = getBuildDirectoryAsPath(); service.buildDockerImage(buildDir, this.extension.getOutputImageTag(), dockerfileContent); service.runDockerImage(buildDir, this.extension.getOutputImageTag()); } @@ -233,44 +231,12 @@ private void deleteDirectory(Path pathToBeDeleted) throws IOException { } } - private String getExtension() { + private String getFilenameExtension() { String os = System.getProperty("os.name").toLowerCase(); return os.startsWith("windows") ? "zip" : "tar.gz"; } private String getFilename() { - return MessageFormat.format("graalvm-ce.{0}", getExtension()); - } - - /** - * Source Input Directory. - * - * @return {@link File} - */ - @InputDirectory - public File getSourceFileDir() { - File file = null; - String dockerFile = this.extension.getDockerFile(); - - if (dockerFile != null) { - Path p = Path.of(dockerFile); - Path parent = p.getParent(); - file = parent != null ? parent.toFile() : projectDirectory.toFile(); - } - - if (file == null) { - file = projectDirectory.resolve("src").resolve("main").toFile(); - } - - return file; - } - - /** - * Set {@link GraalvmNativeExtension}. - * - * @param ext {@link GraalvmNativeExtension} - */ - public void setExtension(final GraalvmNativeExtension ext) { - this.extension = ext; + return MessageFormat.format("graalvm-ce.{0}", getFilenameExtension()); } } diff --git a/src/main/java/com/formkiq/gradle/internal/GradleUtils.java b/src/main/java/com/formkiq/gradle/internal/GradleUtils.java deleted file mode 100644 index 06b58d7..0000000 --- a/src/main/java/com/formkiq/gradle/internal/GradleUtils.java +++ /dev/null @@ -1,66 +0,0 @@ -/** - * Copyright [2020] FormKiQ Inc. Licensed under the Apache License, Version 2.0 (the "License"); you - * may not use this file except in compliance with the License. You may obtain a copy of the License - * at - * - *

- * http://www.apache.org/licenses/LICENSE-2.0 - * - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package com.formkiq.gradle.internal; - -import java.io.File; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Stream; -import org.gradle.api.Project; -import org.gradle.api.artifacts.Configuration; -import org.gradle.api.artifacts.ConfigurationContainer; -import org.gradle.api.artifacts.UnknownConfigurationException; - -/** Gradle Utilities. */ -public class GradleUtils { - - /** private constructor. */ - private GradleUtils() {} - - /** - * Get Runtime Class Path Files. - * - * @param project {@link Project} - * @param buildDir {@link Path} - * @return {@link List} {@link File} - * @throws IOException IOException - */ - public static List getRuntimeClasspath(final Project project, final Path buildDir) - throws IOException { - - List files = new ArrayList<>(); - - Path path = buildDir.resolve("libs"); - - if (path.toFile().exists()) { - try (Stream stream = Files.list(path)) { - files.addAll(stream.map(Path::toFile).toList()); - } - } - - ConfigurationContainer configurations = project.getConfigurations(); - try { - Configuration runtimeClasspath = configurations.getAt("runtimeClasspath"); - files.addAll(runtimeClasspath.getFiles()); - } catch (UnknownConfigurationException e) { - // ignore - } - - return files; - } -} diff --git a/src/main/java/com/formkiq/gradle/internal/NativeImageExecutor.java b/src/main/java/com/formkiq/gradle/internal/NativeImageExecutor.java index 0401bc1..079d599 100644 --- a/src/main/java/com/formkiq/gradle/internal/NativeImageExecutor.java +++ b/src/main/java/com/formkiq/gradle/internal/NativeImageExecutor.java @@ -28,6 +28,7 @@ import java.util.List; import org.apache.tools.ant.helper.DefaultExecutor; import org.gradle.api.Project; +import org.gradle.api.file.ConfigurableFileCollection; import org.gradle.internal.os.OperatingSystem; import org.gradle.process.ExecOperations; @@ -35,7 +36,7 @@ public class NativeImageExecutor { /** Graalvm Java Main. */ - public static final String GRAALVM_JAVA_MAIN = "graalvm/java/main"; + public static final String GRAALVM_JAVA_MAIN = "java/main"; /** {@link GraalvmNativeExtension}. */ private final GraalvmNativeExtension extension; @@ -77,11 +78,12 @@ public void buildGraalvmImage(final ExecOperations execOperations, final Project /** * Build Graalvm classes folder. * - * @param project {@link Project} * @param buildDir {@link Path} + * @param runtimeClasspath {@link ConfigurableFileCollection} */ - public void buildGraalvmJavaMain(final Project project, final Path buildDir) { - new RuntimeDependenciesDecompress(project).apply(buildDir); + public void buildGraalvmJavaMain(final Path buildDir, + final ConfigurableFileCollection runtimeClasspath) { + new RuntimeDependenciesDecompress().apply(buildDir, runtimeClasspath); } List getBuildGraalvmImageArguments(final Project project, final Path buildDir) { @@ -96,7 +98,7 @@ List getBuildGraalvmImageArguments(final Project project, final Path bui args.addAll(new GraalvmClasspathArguments(buildDir).apply(this.extension)); - args.add(this.extension.getMainClassName()); + args.add(this.extension.getMainClassName().get()); return args; } @@ -141,12 +143,14 @@ public void runGuInstallation(final ExecOperations execOperations, final Path gr * @param buildDir {@link Path} * @param graalvmBaseDir {@link Files} * @param outputDir {@link File} + * @param runtimeClasspath {@link ConfigurableFileCollection} * @throws IOException IOException */ public void runNativeImage(final ExecOperations execOperations, final Project project, - final Path buildDir, final File graalvmBaseDir, File outputDir) throws IOException { + final Path buildDir, final File graalvmBaseDir, File outputDir, + final ConfigurableFileCollection runtimeClasspath) throws IOException { - buildGraalvmJavaMain(project, buildDir); + buildGraalvmJavaMain(buildDir, runtimeClasspath); buildGraalvmImage(execOperations, project, buildDir, graalvmBaseDir, outputDir); } diff --git a/src/main/java/com/formkiq/gradle/services/DefaultDockerService.java b/src/main/java/com/formkiq/gradle/services/DefaultDockerService.java index 0ecf445..d74f380 100644 --- a/src/main/java/com/formkiq/gradle/services/DefaultDockerService.java +++ b/src/main/java/com/formkiq/gradle/services/DefaultDockerService.java @@ -85,7 +85,7 @@ public Path buildDockerImage(final Path buildDir, final String imageTag, public void runDockerImage(final Path buildDir, final String imageTag) throws IOException, InterruptedException { - Path path = buildDir.resolve("graalvm/output"); + Path path = buildDir.resolve("output"); Files.createDirectories(path); Volume containerOutputVolume = new Volume("/output"); diff --git a/src/main/java/com/formkiq/gradle/services/DockerService.java b/src/main/java/com/formkiq/gradle/services/DockerService.java index 25b6d9d..b20826a 100644 --- a/src/main/java/com/formkiq/gradle/services/DockerService.java +++ b/src/main/java/com/formkiq/gradle/services/DockerService.java @@ -38,7 +38,7 @@ Path buildDockerImage(Path buildDir, String imageTag, String dockerFileContent) default Path writeDockerFile(final Path buildDir, final String dockerFileContent) throws IOException { - Path dir = buildDir.resolve("graalvm/java/main"); + Path dir = buildDir.resolve("java/main"); Files.createDirectories(dir); Path dockerfilePath = Path.of(dir.toString(), "Dockerfile"); diff --git a/src/main/java/com/formkiq/gradle/services/RuntimeDependenciesDecompress.java b/src/main/java/com/formkiq/gradle/services/RuntimeDependenciesDecompress.java index fa38ae7..c94d47f 100644 --- a/src/main/java/com/formkiq/gradle/services/RuntimeDependenciesDecompress.java +++ b/src/main/java/com/formkiq/gradle/services/RuntimeDependenciesDecompress.java @@ -3,53 +3,45 @@ import static com.formkiq.gradle.internal.NativeImageExecutor.GRAALVM_JAVA_MAIN; import com.formkiq.gradle.internal.ArchiveUtils; -import com.formkiq.gradle.internal.GradleUtils; import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.util.List; -import java.util.function.Function; +import java.util.function.BiFunction; import java.util.stream.Stream; import org.gradle.api.Project; +import org.gradle.api.file.ConfigurableFileCollection; /** Decompress {@link Project} Runtime Dependencies. */ -public class RuntimeDependenciesDecompress implements Function { +public class RuntimeDependenciesDecompress + implements BiFunction { /** {@link ArchiveUtils}. */ private final ArchiveUtils archiveUtils = new ArchiveUtils(); - /** {@link Project}. */ - private final Project project; - - /** - * constructor. - * - * @param project {@link Project} - */ - public RuntimeDependenciesDecompress(final Project project) { - this.project = project; - } + /** constructor. */ + public RuntimeDependenciesDecompress() {} @Override - public Void apply(final Path buildDir) { + public Void apply(final Path buildDir, final ConfigurableFileCollection files) { try { Path outputPath = buildDir.resolve(GRAALVM_JAVA_MAIN); File outputdir = outputPath.toFile(); - List classPathFiles = GradleUtils.getRuntimeClasspath(project, buildDir); - - for (File file : classPathFiles) { - archiveUtils.decompressJar(file, outputdir); + for (File file : files) { + if (file.getName().endsWith(".jar")) { + archiveUtils.decompressJar(file.toPath().toFile(), outputdir); + } } - Path libsDir = buildDir.resolve("libs"); + Path libsDir = buildDir.resolve("../libs"); try (Stream stream = Files.list(libsDir)) { - List files = stream.map(Path::toFile).toList(); + List libFiles = stream.map(Path::toFile).toList(); - for (File file : files) { + for (File file : libFiles) { archiveUtils.decompressJar(file, outputdir); } } diff --git a/src/main/java/com/formkiq/gradle/services/ShellDockerService.java b/src/main/java/com/formkiq/gradle/services/ShellDockerService.java index 279c866..9a64dd8 100644 --- a/src/main/java/com/formkiq/gradle/services/ShellDockerService.java +++ b/src/main/java/com/formkiq/gradle/services/ShellDockerService.java @@ -27,7 +27,7 @@ public boolean isDockerRunning() { @Override public void runDockerImage(final Path buildDir, final String imageTag) throws IOException { - Path dir = buildDir.resolve("graalvm/output"); + Path dir = buildDir.resolve("output"); Files.createDirectories(dir); String hostOutputDir = dir.toAbsolutePath().toString(); diff --git a/src/test/java/com/formkiq/gradle/services/DockerServiceTests.java b/src/test/java/com/formkiq/gradle/services/DockerServiceTests.java index 4c0d53c..a90c2e2 100644 --- a/src/test/java/com/formkiq/gradle/services/DockerServiceTests.java +++ b/src/test/java/com/formkiq/gradle/services/DockerServiceTests.java @@ -19,7 +19,7 @@ class DockerServiceTests { private static final String TEST_IMAGE_NAME = "generated-graalvm-native-plugin"; private static final String DOCKER_IMAGE_24 = "ghcr.io/graalvm/native-image-community:24.0.1"; - private static final Path BUILD_DIR = Paths.get("build"); + private static final Path BUILD_DIR = Paths.get("build/graalvm"); private static final Path PATH = BUILD_DIR.resolve(GRAALVM_JAVA_MAIN); @Test From da82d3d0afb7c0cf2966607b3161e65f939cb2fb Mon Sep 17 00:00:00 2001 From: Mike Friesen Date: Thu, 18 Sep 2025 21:40:10 -0500 Subject: [PATCH 2/2] Updated dependencies to 1.7.3 --- README.md | 8 ++++---- samples/aws-lambda/HelloWorldFunction/build.gradle | 2 +- samples/dockerfile/build.gradle | 2 +- samples/helloworld/app/build.gradle | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index c2c73e8..4f0b864 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ Supports for building Java applications as GraalVM native images. Using the [plugins DSL](https://docs.gradle.org/current/userguide/plugins.html#sec:plugins_block): ```groovy plugins { - id 'com.formkiq.gradle.graalvm-native-plugin' version '1.7.0' + id 'com.formkiq.gradle.graalvm-native-plugin' version '1.7.3' } ``` @@ -25,7 +25,7 @@ buildscript { } } dependencies { - classpath "com.formkiq.gradle:graalvm-native-plugin:1.7.0" + classpath "com.formkiq.gradle:graalvm-native-plugin:1.7.3" } } @@ -36,7 +36,7 @@ apply plugin: "com.formkiq.gradle.graalvm-native-plugin" Using the [plugins DSL](https://docs.gradle.org/current/userguide/plugins.html#sec:plugins_block): ```kotlin plugins { - id("com.formkiq.gradle.graalvm-native-plugin") version "1.7.0" + id("com.formkiq.gradle.graalvm-native-plugin") version "1.7.3" } ``` @@ -49,7 +49,7 @@ buildscript { } } dependencies { - classpath("com.formkiq.gradle:graalvm-native-plugin:1.7.0") + classpath("com.formkiq.gradle:graalvm-native-plugin:1.7.3") } } diff --git a/samples/aws-lambda/HelloWorldFunction/build.gradle b/samples/aws-lambda/HelloWorldFunction/build.gradle index 413c32e..75d6533 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.0-SNAPSHOT' + id 'com.formkiq.gradle.graalvm-native-plugin' version '1.7.3' } repositories { diff --git a/samples/dockerfile/build.gradle b/samples/dockerfile/build.gradle index 48900e9..47ea26c 100644 --- a/samples/dockerfile/build.gradle +++ b/samples/dockerfile/build.gradle @@ -6,7 +6,7 @@ */ plugins { id 'java' - id 'com.formkiq.gradle.graalvm-native-plugin' version '1.7.0-SNAPSHOT' + id 'com.formkiq.gradle.graalvm-native-plugin' version '1.7.3' } nativeImage { diff --git a/samples/helloworld/app/build.gradle b/samples/helloworld/app/build.gradle index 067dbdf..ec638c2 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.0-SNAPSHOT' + id 'com.formkiq.gradle.graalvm-native-plugin' version '1.7.3' } sourceCompatibility = "11"