我的雇主有一个需求,需要使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类文件编译是不确定的?