diff a/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/JlinkTask.java b/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/JlinkTask.java
--- a/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/JlinkTask.java
+++ b/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/JlinkTask.java
@@ -1,7 +1,7 @@
 /*
- * Copyright (c) 2015, 2024, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License version 2 only, as
  * published by the Free Software Foundation.  Oracle designates this
@@ -347,25 +347,26 @@
         Objects.requireNonNull(config);
         Objects.requireNonNull(config.getOutput());
         plugins = plugins == null ? new PluginsConfiguration() : plugins;
 
         // First create the image provider
-        ImageProvider imageProvider =
-                createImageProvider(config,
-                                    null,
-                                    IGNORE_SIGNING_DEFAULT,
-                                    false,
-                                    null,
-                                    false,
-                                    new OptionsValues(),
-                                    null);
-
-        // Then create the Plugin Stack
-        ImagePluginStack stack = ImagePluginConfiguration.parseConfiguration(plugins);
-
-        //Ask the stack to proceed;
-        stack.operate(imageProvider);
+        try (ImageHelper imageProvider =
+                     createImageProvider(config,
+                             null,
+                             IGNORE_SIGNING_DEFAULT,
+                             false,
+                             null,
+                             false,
+                             new OptionsValues(),
+                             null)) {
+
+            // Then create the Plugin Stack
+            ImagePluginStack stack = ImagePluginConfiguration.parseConfiguration(plugins);
+
+            // Ask the stack to proceed;
+            stack.operate(imageProvider);
+        }
     }
 
     // the token for "all modules on the module path"
     private static final String ALL_MODULE_PATH = "ALL-MODULE-PATH";
     private JlinkConfiguration initJlinkConfig() throws BadArgs {
@@ -484,26 +485,28 @@
             throw taskHelper.newBadArgs("err.mods.must.be.specified", "--add-modules")
                             .showUsage(true);
         }
 
         // First create the image provider
-        ImageHelper imageProvider = createImageProvider(config,
-                                                        options.packagedModulesPath,
-                                                        options.ignoreSigning,
-                                                        options.bindServices,
-                                                        options.endian,
-                                                        options.verbose,
-                                                        options,
-                                                        log);
-
-        // Then create the Plugin Stack
-        ImagePluginStack stack = ImagePluginConfiguration.parseConfiguration(
-            taskHelper.getPluginsConfig(options.output, options.launchers,
-                    imageProvider.targetPlatform));
-
-        //Ask the stack to proceed
-        stack.operate(imageProvider);
+        try (ImageHelper imageProvider = createImageProvider(config,
+                options.packagedModulesPath,
+                options.ignoreSigning,
+                options.bindServices,
+                options.endian,
+                options.verbose,
+                options,
+                log)) {
+            // Then create the Plugin Stack
+            ImagePluginStack stack = ImagePluginConfiguration.parseConfiguration(
+                    taskHelper.getPluginsConfig(
+                            options.output,
+                            options.launchers,
+                            imageProvider.targetPlatform));
+
+            //Ask the stack to proceed
+            stack.operate(imageProvider);
+        }
     }
 
     /**
      * @return the system module path or null
      */
@@ -1025,14 +1028,15 @@
         }
 
         return sb.toString();
     }
 
-    private static record ImageHelper(Set<Archive> archives,
-                                      Platform targetPlatform,
-                                      Path packagedModulesPath,
-                                      boolean generateRuntimeImage) implements ImageProvider {
+    private record ImageHelper(Set<Archive> archives,
+                               Platform targetPlatform,
+                               Path packagedModulesPath,
+                               boolean generateRuntimeImage)
+            implements ImageProvider, AutoCloseable {
         @Override
         public ExecutableImage retrieve(ImagePluginStack stack) throws IOException {
             ExecutableImage image = ImageFileCreator.create(archives,
                     targetPlatform.arch().byteOrder(), stack, generateRuntimeImage);
             if (packagedModulesPath != null) {
@@ -1044,7 +1048,27 @@
                     Files.copy(file, dest);
                 }
             }
             return image;
         }
+
+        @Override
+        public void close() throws IOException {
+            List<IOException> thrown = null;
+            for (Archive archive : archives) {
+                try {
+                    archive.close();
+                } catch (IOException ex) {
+                    if (thrown == null) {
+                        thrown = new ArrayList<>();
+                    }
+                    thrown.add(ex);
+                }
+            }
+            if (thrown != null) {
+                IOException ex = new IOException("Archives could not be closed", thrown.getFirst());
+                thrown.subList(1, thrown.size()).forEach(ex::addSuppressed);
+                throw ex;
+            }
+        }
     }
 }
