2

我正在使用具有相同 JVM 的本地机器(Windows 和 Cygwin)上构建的 jar 文件验证远程 unix 盒子上存在的 jar 文件。

作为 POC,我正在尝试验证是否使用在我的机器上生成的 jar 文件生成了相同的校验和,并在下面进行了尝试,

  1. 第一次使用ant脚本生成jar文件
  2. 计算校验和(例如“xyz abc”)
  3. 使用相同的 ant 脚本再次生成 jar 文件,而无需更改任何内容
  4. 我得到不同的校验和但相同的字节数(例如“xvw abc”)

我不确定java内部进程如何生成类文件然后生成jar文件,有人可以帮我理解以下几点

  1. cksumunix/cygwin的实用程序在得出值时是否考虑文件的时间戳?
  2. 如果我们保持其他所有内容相同[编译器版本+源代码+机器+环境],生成的编译类文件/jar文件的校验和会不同吗?
4

1 回答 1

4

对问题 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

于 2018-10-18T14:02:39.790 回答