使用jlink可复制的构建

问题描述

简化的JDK(使用jlink创建)是我们应用程序的一部分。 JDK映像所需的模块很少更改。不幸的是,生成一个新的JDK映像(具有完全相同的jlink参数)会导致输出不同,所以 客户必须在差异升级过程中一次又一次地下载相同的文件。

这是PoC:

$ mkdir jdk-15a jdk-15b
$ tar xzf openjdk-15_linux-x64_bin.tar.gz --directory jdk-15a/
$ tar xzf openjdk-15_linux-x64_bin.tar.gz --directory jdk-15b/
$ jdk-15a/jdk-15/bin/jlink --compress=1 --module-path jdk-15a/jdk-15/jmods --add-modules java.base,jdk.management,jdk.unsupported,jdk.charsets --output output01
$ jdk-15b/jdk-15/bin/jlink --compress=1 --module-path jdk-15b/jdk-15/jmods --add-modules java.base,jdk.charsets --output output02
$ md5sum output*/lib/modules
9ae5ae63df59593a0892c5ed411d7e59  output01/lib/modules
24b4af31553670799ab286ad1186329e  output02/lib/modules

(我正在使用jdk-15ajdk-15b目录,类似于多个构建服务器上的JDK实例。)

在这种情况下,有什么方法可以从jlink中获得byte-to-byte identical output (reproducible build)

使用的JDK版本:

$ cat jdk-15a/jdk-15/release 
IMPLEMENTOR="Oracle Corporation"
JAVA_VERSION="15"
JAVA_VERSION_DATE="2020-09-15"
...
OS_ARCH="x86_64"
OS_NAME="Linux"
SOURCE=".:hg:e3f940bd3c8f"

解决方法

这是一个JDK错误,报告于JDK-8252730

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...