On 12/03/2020 07:32, Yangfei (Felix) wrote:
:
I looked into the JLinkReproducibleTest.
There are only two modules contained in lib/modules of the image: main and 
java.base.
I changed the test specifying --keep-packaged-modules:
diff -r 8c5697ed51b2 test/jdk/tools/jlink/JLinkReproducibleTest.java
--- a/test/jdk/tools/jlink/JLinkReproducibleTest.java   Wed Mar 11 08:34:14 
2020 +0100
+++ b/test/jdk/tools/jlink/JLinkReproducibleTest.java   Thu Mar 12 15:30:45 
2020 +0800
@@ -49,6 +49,8 @@
          cmd.addAll(List.of(
              "--module-path", JMODS_DIR.toString() + File.pathSeparator + 
CLASS_DIR.toString(),
              "--add-modules", "main",
+            "--keep-packaged-modules",
+            image.resolve("jmods").toString(),
              "--compress=2",
              "--output", image.toString()
          ));

One extra java.base.jmod file will be emitted for each image created:
   image-second/jmods/java.base.jmod
   image-fourth/jmods/java.base.jmod
   image-third/jmods/java.base.jmod
   image-first/jmods/java.base.jmod

These jmod files are the same with the one located in the JDK install directory.
The ModuleHashes attribute is written in java.base.jmod file when building JDK.
So the java.base.jmod will always be the same for each run of the 
JLinkReproducibleTest.
Maybe I missed something? Could you please say something more on how extending 
the test?

The `jmod` and `jar` tools can be used to compute the hashes of a set of intimately connected modules. If modules A, B and C are tightly connected, and A requires B and C, then you can use the tooling to create a packaged form of A that includes the hashes of B and C. The hashes are checked at link-time (and in the case of modular JARs on the modular path, at run-time too). So I think you'll need a new test. It might be that running `jmod --hash-modules` with just two dependences is enough to have the entries written to the ModuleHashes attribute in random order. A buddy test to JLinkReproducibleTest that creates a run-time image containing "user modules" that are tightly connected would be a good test.

I'm pretty sure that this isn't the last issue related to reproducible builds. Amy is chasing another one that arises with compressed images (jlink --compress=2) that may need work too.

-Alan

Reply via email to