java - 是否可以强制 Java 8 编译器创建可重现的类文件?

标签 java lambda javac binary-reproducibility

我的雇主有一项业务需要让 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$15lambda$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/

相关文章:

java - 序列化 CompletableFuture 字节码

java - 另一个 RMI 问题

java - 有关编译时和运行时依赖性及其解决方案的问题吗?

java - 如何在运行时将java自定义或字符串对象添加到DAO模型对象?

java - Android WebView 完全不尊重 UI 布局

c# - 创建任务时List Index Out of Range异常

java - 如何在 Java 中用 lambda 替换匿名类?

java - 仅当源级别为 5.0 时注释才可用 语法错误 java

java - 从文本文件中获取数据并将其放入锯齿状数组中

java - 启用 html 的 android ListView