Java 重复构建的渐变相同校验和

Java 重复构建的渐变相同校验和,java,gradle,checksum,binary-reproducibility,Java,Gradle,Checksum,Binary Reproducibility,我正在用gradle构建一个Java项目,希望将校验和文件与构建的工件一起发布。问题是重复的构建在没有任何代码更改的情况下生成不同的校验和。在花了一段时间追查这个问题之后,原因很明显: 生成的类文件会得到它们创建时的创建/修改时间戳(很棒的发现!!) 此修改日期作为元数据添加到生成的jar/zip归档文件中,从而导致校验和差异 也就是说,实际上不可能在以后的某个时间点重新构建将输出相同文件的特定版本 我认为,通过将创建后工件的修改/创建日期更改为某个默认值来“修复”这个问题非常容易。但这会导致档

我正在用gradle构建一个Java项目,希望将校验和文件与构建的工件一起发布。问题是重复的构建在没有任何代码更改的情况下生成不同的校验和。在花了一段时间追查这个问题之后,原因很明显:

  • 生成的类文件会得到它们创建时的创建/修改时间戳(很棒的发现!!)
  • 此修改日期作为元数据添加到生成的jar/zip归档文件中,从而导致校验和差异
  • 也就是说,实际上不可能在以后的某个时间点重新构建将输出相同文件的特定版本

    我认为,通过将创建后工件的修改/创建日期更改为某个默认值来“修复”这个问题非常容易。但这会导致档案中出现奇怪的元数据信息——类似于
    1970-01-01T00:00:00Z
    的内容非常明显,但乍一看仍然令人困惑

    是否有其他方法可以在创建归档时完全省略时间戳元数据。还是在创建存档后将其删除

    或者有没有其他方法可以让重复构建生成相同的工件


    我真想知道这种情况下的最佳实践是什么

    您可以使用Gradle生成可复制的档案,而IIUC正是您想要的。Gradle的文档中记录了此功能

    您需要按照以下方式配置项目:

    tasks.withType(AbstractArchiveTask) {
        preserveFileTimestamps = false
        reproducibleFileOrder = true
    }
    
    看起来甚至有一个插件可以为您配置,尽管它似乎不再处于活动状态: