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

标签 checksum javacompiler

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

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

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

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

  1. unix/cygwin 的 cksum 实用程序在计算值时是否考虑了文件的时间戳?
  2. 如果我们保持所有其他内容相同 [编译器版本 + 源代码 + 机器 + 环境],生成的已编译类文件/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/

相关文章:

java - 计算目录的 SHA-1

c - 如何将无符号字符数组解释为十六进制数组?

c# - Convert.ToInt32 出现问题并出现错误索引和长度必须引用字符串中的位置

java - 如何避免 IntelliJ 重置语言级别?

java - Java编译器的内部架构

java - Kotlin 编译器或 Java 反编译器的奇怪行为

reverse-engineering - 逆向工程UPS串行协议(protocol): Checksum/CRC?

algorithm - 错误恢复算法?

java - 如何动态编译和运行资源中带有.class文件的.java文件?

创建依赖类时,JavaCompiler 给出错误