From 7902b5a5a50b633fd3819881cc4440053b930328 Mon Sep 17 00:00:00 2001 From: Jendrik Johannes Date: Thu, 7 Dec 2023 17:30:23 +0100 Subject: [PATCH] Jar patching is reproducible (#89) --- .../ExtraJavaModuleInfoTransform.java | 27 ++++++++++++++++--- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/gradlex/javamodule/moduleinfo/ExtraJavaModuleInfoTransform.java b/src/main/java/org/gradlex/javamodule/moduleinfo/ExtraJavaModuleInfoTransform.java index 6b79d47..a0b9244 100644 --- a/src/main/java/org/gradlex/javamodule/moduleinfo/ExtraJavaModuleInfoTransform.java +++ b/src/main/java/org/gradlex/javamodule/moduleinfo/ExtraJavaModuleInfoTransform.java @@ -35,6 +35,7 @@ import org.objectweb.asm.Opcodes; import javax.annotation.Nullable; +import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; @@ -46,8 +47,10 @@ import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.util.ArrayList; +import java.util.Calendar; import java.util.Collection; import java.util.Collections; +import java.util.GregorianCalendar; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -55,6 +58,7 @@ import java.util.Set; import java.util.TreeSet; import java.util.jar.JarEntry; +import java.util.jar.JarFile; import java.util.jar.JarInputStream; import java.util.jar.JarOutputStream; import java.util.jar.Manifest; @@ -82,6 +86,9 @@ public abstract class ExtraJavaModuleInfoTransform implements TransformAction getModuleSpecs(); @@ -260,7 +267,7 @@ private void addModuleDescriptor(File originalJar, File moduleJar, ModuleInfo mo Set packages = new TreeSet<>(); copyAndExtractProviders(inputStream, outputStream, !moduleInfo.getMergedJars().isEmpty(), providers, packages); mergeJars(moduleInfo, outputStream, providers, packages); - outputStream.putNextEntry(new JarEntry("module-info.class")); + outputStream.putNextEntry(newReproducibleEntry("module-info.class")); outputStream.write(addModuleInfo(moduleInfo, providers, versionFromFilePath(originalJar.toPath()), moduleInfo.exportAllPackages ? packages : Collections.emptySet())); outputStream.closeEntry(); @@ -271,7 +278,14 @@ private void addModuleDescriptor(File originalJar, File moduleJar, ModuleInfo mo } private JarOutputStream newJarOutputStream(OutputStream out, @Nullable Manifest manifest) throws IOException { - return manifest == null ? new JarOutputStream(out) : new JarOutputStream(out, manifest); + JarOutputStream jar = new JarOutputStream(out); + if (manifest != null) { + ZipEntry e = newReproducibleEntry(JarFile.MANIFEST_NAME); + jar.putNextEntry(e); + manifest.write(new BufferedOutputStream(jar)); + jar.closeEntry(); + } + return jar; } private void copyAndExtractProviders(JarInputStream inputStream, JarOutputStream outputStream, boolean willMergeJars, Map> providers, Set packages) throws IOException { @@ -450,8 +464,7 @@ private void mergeJars(ModuleSpec moduleSpec, JarOutputStream outputStream, Map< private void mergeServiceProviderFiles(JarOutputStream outputStream, Map> providers) throws IOException { for (Map.Entry> provider : providers.entrySet()) { - JarEntry jarEntry = new JarEntry(SERVICES_PREFIX + provider.getKey()); - outputStream.putNextEntry(jarEntry); + outputStream.putNextEntry(newReproducibleEntry(SERVICES_PREFIX + provider.getKey())); for (String implementation : provider.getValue()) { outputStream.write(implementation.getBytes()); outputStream.write("\n".getBytes()); @@ -460,6 +473,12 @@ private void mergeServiceProviderFiles(JarOutputStream outputStream, Map