在后续构建中编译的jar文件的不同校验和结果?

时间:2016-04-29 05:05:19

标签: checksum javacompiler

我正在使用相同的JVM验证远程unix盒子上的jar文件和内置本地机器(Windows& Cygwin)上的jar文件。

作为POC我试图验证是否在我的机器上使用连续构建生成的jar文件生成相同的校验和,我在下面尝试过,

  1. 首次使用ant script
  2. 生成jar文件
  3. 计算校验和(例如" xyz abc")
  4. 使用相同的ant脚本再次生成jar文件而不更改任何内容
  5. 我得到了不同的校验和但字节数相同(例如" xvw abc")
  6. 我不确定java内部进程如何生成类文件然后生成jar文件,有人可以帮我理解下面几点

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

1 个答案:

答案 0 :(得分:2)

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