【问题标题】:Different checksum results for jar files compiled on subsequent build?在后续构建中编译的 jar 文件的校验和结果不同?
【发布时间】:2016-04-29 05:05:19
【问题描述】:

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

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

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

我不确定java内部进程是如何产生类文件和jar文件的,有人可以帮我理解以下几点

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

【问题讨论】:

  • 你找到解决方案了吗?
  • 不,我必须反编译所有类文件并验证

标签: checksum javacompiler


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-25
    • 2017-07-03
    • 1970-01-01
    • 2015-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-22
    相关资源
    最近更新 更多