我的雇主有一项业务需要让 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 类文件编译不确定?
最佳答案
我没有仔细研究,但是 this article讨论 Java 中的可重现构建,以及 reproducible-builds有一些工具可以帮助构建(和类)可重现。
您可能正在寻找的链接是 Reproducible Build Maven Plugin ,专门为 Java 制作,试图“从生成的工件中去除不可复制的数据”。
关于java - 是否可以强制 Java 8 编译器创建可重现的类文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55150805/