我的雇主有业务需要使 Java 构建逐字节可重复。我知道使 JAR 文件可重现的困难(由于归档顺序和时间戳),但此时我正在谈论类文件。
我在 Mac 和 Linux 上都使用 Java 8u65 构建了相同的代码。类文件是二进制不同的。两个类都反编译回相同的源;要查看差异需要 javap 反汇编程序。
源代码似乎是:
final TrustStrategy acceptingTrustStrategy =
(X509Certificate[] chain, String authType) -> true;
在一个构建中,结果是:
private static boolean lambda$restTemplate$38(java.security.cert.X509Certificate[], java.lang.String) throws java.security.cert.CertificateException;
Code:
0: iconst_1
1: ireturn
另一方面,它是:
private static boolean lambda$restTemplate$15(java.security.cert.X509Certificate[], java.lang.String) throws java.security.cert.CertificateException;
Code:
0: iconst_1
1: ireturn
匿名 lambda 的名称中包含不同的数字(lambda$restTemplate$15
与lambda$restTemplate$38
)。
看来,当我在同一台主机上重建时,我得到了相同的字节。当主机不同时,数字会改变;两个 Linux 主机产生不同的字节。
是什么决定了这些数字?有没有办法强制每个编译在这个地方使用相同的数字,从而产生相同的类文件?还是 Java 8 类文件编译不确定?