On Mon, 7 Jun 2021 11:00:00 GMT, Athijegannathan Sundararajan <[email protected]> wrote:
> jlink should clean up output directory on any failure. should not leave > partially filled output. WRT the test failure on Windows discussed offline: when the directory is deleted as a result of a `PluginException` being thrown, there is still an open file handle on the `lib/modules` file in the image directory, which prevents the directory from being deleted. Bisecting this, it seems that the file handle is being created in `ImageFileCreater::writeImage` with a call to `plugins.getJImageFileOutputStream` (https://github.com/openjdk/jdk/blob/master/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ImageFileCreator.java#L162). This creates an output stream that is never closed. Following patch fixes: diff --git a/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ImageFileCreator.java b/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ImageFileCreator.java index 749025bea9d..8beddc5a037 100644 --- a/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ImageFileCreator.java +++ b/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ImageFileCreator.java @@ -158,8 +158,10 @@ public final class ImageFileCreator { BasicImageWriter writer = new BasicImageWriter(byteOrder); ResourcePoolManager allContent = createPoolManager(archives, entriesForModule, byteOrder, writer); - ResourcePool result = generateJImage(allContent, - writer, plugins, plugins.getJImageFileOutputStream()); + ResourcePool result; + try (DataOutputStream out = plugins.getJImageFileOutputStream()) { + result = generateJImage(allContent, writer, plugins, out); + } //Handle files. try { ------------- PR: https://git.openjdk.java.net/jdk/pull/4386
