diff --git a/core/src/main/java/org/moditect/commands/AddModuleInfo.java b/core/src/main/java/org/moditect/commands/AddModuleInfo.java index 1de4cb2..1357c23 100644 --- a/core/src/main/java/org/moditect/commands/AddModuleInfo.java +++ b/core/src/main/java/org/moditect/commands/AddModuleInfo.java @@ -13,6 +13,7 @@ import java.io.OutputStream; import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.StandardCopyOption; import java.nio.file.attribute.FileTime; import java.time.Instant; import java.util.Enumeration; @@ -97,12 +98,12 @@ public void run() { ModuleDeclaration module = ModuleInfoCompiler.parseModuleInfo(moduleInfoSource); byte[] clazz = ModuleInfoCompiler.compileModuleInfo(module, mainClass, version); + Path tmpOutputJar = null; try { - Files.createDirectories(outputJar.toAbsolutePath().getParent()); - Files.createFile(outputJar.toAbsolutePath()); + tmpOutputJar = Files.createTempFile("moditect", "jar"); } catch (IOException e) { - throw new RuntimeException("Couldn't copy JAR file", e); + throw new RuntimeException("Couldn't create tmp JAR file", e); } boolean versionedModuleInfo = jvmVersion != null; @@ -111,7 +112,7 @@ public void run() { // brute force copy all entries try (JarFile jarFile = new JarFile(inputJar.toAbsolutePath().toFile()); - JarOutputStream jarout = new JarOutputStream(Files.newOutputStream(outputJar.toAbsolutePath(), TRUNCATE_EXISTING))) { + JarOutputStream jarout = new JarOutputStream(Files.newOutputStream(tmpOutputJar.toAbsolutePath(), TRUNCATE_EXISTING))) { Enumeration entries = jarFile.entries(); while (entries.hasMoreElements()) { JarEntry inputEntry = entries.nextElement(); @@ -157,6 +158,14 @@ else if ((MODULE_INFO_CLASS.equals(inputEntry.getName()) && !versionedModuleInfo catch (IOException e) { throw new RuntimeException("Couldn't add module-info.class to JAR", e); } + + try { + Files.createDirectories(outputJar.toAbsolutePath().getParent()); + Files.move(tmpOutputJar, outputJar, StandardCopyOption.REPLACE_EXISTING); + } + catch (IOException e) { + throw new RuntimeException("Couldn't copy JAR file", e); + } } private FileTime toFileTime(Instant timestamp) {