gpt4 book ai didi

java - 如何使用 javac 跨不同平台创建二进制相同的类文件?

转载 作者:塔克拉玛干 更新时间:2023-11-01 23:04:50 25 4
gpt4 key购买 nike

我用 Java 编写 AWS Lambda 函数。我用来上传我的 lambda 的工具 ( Terraform ) 想要使用我的 jar 文件的 SHA-256 哈希来跟踪是否需要上传新版本的 lambda。

问题是,不同操作系统平台(Windows 和 Linux)上的不同 JDK 创建的字节码略有不同(即使使用相同的“更新”版本的 JDK 也是如此)。这意味着,如果我在 Windows 上上传一个 lambda,然后在 Linux 上重新运行该过程 - 它会检测到 jar 的不同哈希码并不必要地重新上传 lambda jar。

问题:我如何强制 javac 在不同的操作系统平台上创建相同的字节码?

最佳答案

你不能强制执行。关于生成的类文件,有几个未指定的详细信息,例如某些源代码表达式的字节码必须如何精确查看或成员或属性的顺序。

由于不需要在每次运行中生成完全相同的文件,编译器实现甚至不会尝试。可以公平地假设,当您使用完全相同的输入(不仅是相同的源代码,而且是相同的选项)执行相同的软件时,它会产生相同的输出,但这不仅需要相同的编译器版本,而且也是相同的 JRE。

不幸的是,即使使用相同的实现和输入,也可能有不同的行为。例如,在一些 Java 7 实现中尝试随机化 java.util.HashMap 的散列,如果 javac 将某些工件存储在 HashMap 。这不适用于 Java 8,但可能适用于将在 Java 9 中引入的不可变映射。编译器是否会使用该功能是不可预测的。

因此,如果您发现某个特定的 jdk 版本可重复生成完全相同的字节码,您现在可能可以使用它,但必须注意下一个版本可能没有该属性。

到目前为止还没有解决即使具有相同的字节码也不能保证具有相同的 jar 文件,因为 jar 文件中文件的顺序是未指定的。它可能取决于系统特定的文件迭代顺序。此外,由于 jar 文件是存储时间戳的 zip 文件,新编译的类文件肯定会产生不同的文件,除非您采取其他措施,例如为所有条目强制执行特定的时间戳。

关于java - 如何使用 javac 跨不同平台创建二进制相同的类文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41970013/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com