changeset 59178:bb90831da57e

8241602: jlink does not produce reproducible jimage files Reviewed-by: alanb, ihse
author jlaskey
date Wed, 06 May 2020 12:49:58 -0300
parents d0a5ea2538b3
children 8f5259729877
files src/jdk.jlink/share/classes/jdk/tools/jlink/internal/DirArchive.java src/jdk.jlink/share/classes/jdk/tools/jlink/internal/JarArchive.java src/jdk.jlink/share/classes/jdk/tools/jlink/internal/JmodArchive.java test/jdk/tools/jlink/JLinkReproducible2Test.java
diffstat 4 files changed, 103 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/DirArchive.java	Wed May 06 15:51:49 2020 +0200
+++ b/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/DirArchive.java	Wed May 06 12:49:58 2020 -0300
@@ -153,4 +153,20 @@
     private static String getPathName(Path path) {
         return path.toString().replace(File.separatorChar, '/');
     }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(dirPath, moduleName);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (obj instanceof DirArchive) {
+            DirArchive other = (DirArchive)obj;
+            return Objects.equals(dirPath, other.dirPath) &&
+                   Objects.equals(moduleName, other.moduleName);
+        }
+
+        return false;
+    }
 }
--- a/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/JarArchive.java	Wed May 06 15:51:49 2020 +0200
+++ b/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/JarArchive.java	Wed May 06 12:49:58 2020 -0300
@@ -133,4 +133,21 @@
     protected JarFile getJarFile() {
         return jarFile;
     }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(file, moduleName, version);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (obj instanceof JarArchive) {
+            JarArchive other = (JarArchive)obj;
+            return Objects.equals(file, other.file) &&
+                   Objects.equals(moduleName, other.moduleName) &&
+                   Objects.equals(version, other.version);
+        }
+
+        return false;
+    }
 }
--- a/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/JmodArchive.java	Wed May 06 15:51:49 2020 +0200
+++ b/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/JmodArchive.java	Wed May 06 12:49:58 2020 -0300
@@ -174,4 +174,20 @@
 
         return new JmodEntry(path, resourceName, type, entry);
     }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(file, moduleName);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (obj instanceof JmodArchive) {
+            JmodArchive other = (JmodArchive)obj;
+            return Objects.equals(file, other.file) &&
+                   Objects.equals(moduleName, other.moduleName);
+        }
+
+        return false;
+    }
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jdk/tools/jlink/JLinkReproducible2Test.java	Wed May 06 12:49:58 2020 -0300
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2020, 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.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.spi.ToolProvider;
+
+/*
+ * @test
+ * @summary Make sure that jimages are consistent when created by jlink.
+ * @bug 8241602
+ * @modules jdk.jlink
+ *          java.se
+ * @run main JLinkReproducible2Test
+ */
+public class JLinkReproducible2Test {
+    static final ToolProvider JLINK_TOOL = ToolProvider.findFirst("jlink")
+            .orElseThrow(() ->
+                    new RuntimeException("jlink tool not found")
+            );
+
+    public static void main(String[] args) throws Exception {
+        Path image1 = Paths.get("./image1");
+        Path image2 = Paths.get("./image2");
+
+        JLINK_TOOL.run(System.out, System.err, "--add-modules", "java.se", "--output", image1.toString());
+        JLINK_TOOL.run(System.out, System.err, "--add-modules", "java.se", "--output", image2.toString());
+
+        if (Files.mismatch(image1.resolve("lib").resolve("modules"), image2.resolve("lib").resolve("modules")) != -1L) {
+            new RuntimeException("jlink producing inconsistent result");
+        }
+    }
+}