我正在验证远程 unix 机器上存在的 jar 文件与在具有相同 JVM 的本地机器(Windows 和 Cygwin)上构建的 jar 文件。
作为 POC,我正在尝试验证在我的机器上连续构建生成的 jar 文件是否生成了相同的校验和,我在下面尝试过,
- 第一次使用ant脚本生成jar文件
- 计算校验和(例如“xyz abc”)
- 使用相同的 ant 脚本再次生成 jar 文件而不做任何更改
- 我得到了不同的校验和但字节数相同(例如“xvw abc”)
我不确定 java 内部进程如何生成类文件然后生成 jar 文件,有人可以帮助我理解以下几点
- unix/cygwin 的
cksum
实用程序在计算值时是否考虑了文件的时间戳? - 如果我们保持所有其他内容相同 [编译器版本 + 源代码 + 机器 + 环境],生成的已编译类文件/jar 文件的校验和是否会不同?
最佳答案
问题 1 的答案:cksum 不考虑存档(例如 jar 文件)的时间戳,但它确实考虑 jarfile 中文件的时间戳。
问题 2 的答案:单个类文件的校验和将与所有其他相同的东西(源代码、编译器等)相同。jar 文件的校验和将不同。差异的原因可能是 jarfile 中文件的时间戳,或者文件是否以不同的顺序放入存档(例如,由并行构建引起)。
如果您想使用 gradle 创建可重现的构建,您可以使用以下配置:
tasks.withType(AbstractArchiveTask) {
preserveFileTimestamps = false
reproducibleFileOrder = true
}
Maven 允许类似的东西,抱歉我不知道如何用 ant 做到这一点..
更多信息在这里:
https://dzone.com/articles/reproducible-builds-in-java
https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=74682318
关于checksum - 在后续构建中编译的 jar 文件的不同校验和结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36929950/