有比较两个 .jar 文件的可靠方法吗?

Is there a reliable way to compare two .jar files?

我正在努力改进我们的开发流程。作为其中的一部分,当开发人员需要重新部署某些服务作为测试其更改的一部分时,我希望通过仅重新部署那些 actually 已更改的服务来改进我们的流程 - 也就是说, 运行 的 fat jar 有任何源更改。

由于我们目前没有复杂的版本控制方案,很遗憾,这不是一种选择。

我最初的想法是这样的:

  1. 保存先前部署的 jar(或其哈希)列表,当前为 运行。
  2. 重新部署后,首先 assemble 所有相关的 jar。对生成的 jar 文件执行 md5sum 并与当前的进行比较。如果匹配,将其添加到不会重新部署的排除列表中。
  3. 如果哈希不匹配,重新部署。

不幸的是,经过相当多的搜索并试图让它工作后,我发现即使是两个具有 完全相同的源和资源内容 的罐子也会产生不同的校验和:这是由于 jar 只是一个美化的 zip,因此确实具有指示日期的文件头。不幸的是,这意味着一个简单的 md5sum first.jar second.jar 将永远无法工作。

是否有任何标准方法?如果可能的话,我想避免将内容提取到某个临时目录并将这些内容与要重新部署的可能服务的数量进行比较,最后我可能不会节省太多时间。

我们解决这个问题的方法是让我们的构建工具管理比较,而不是尝试自己做。我们在我们的构建服务器上保存了之前的构建信息并简单地重建了项目 - 在这种情况下 Gradle 注意到哪些 jar 是最新的,哪些不是。

之后,我们简单地比较了“先前”构建和“当前”构建的校验和,现在可以正确说明哪些 jar 已真正更新。

编辑:

截至 2019 年 5 月 28 日,无需依赖已保存的构建信息即可轻松获得 Spring Boot Jar 的可重现构建。参见 this gist as well as the therein linked Spring issue