我观察到了Clojure编译器的奇怪之处:它可以为相同的输入生成不同的输出。也就是说,生成的.class文件包含不同的字节,尽管在其他方面有相同的运行时行为。为什么会出现这种情况?我创建了一个Docker容器和脚本,展示了该问题。
虽然这在最终生成的Java程序的功能方面并没有危害,但这仍然是尝试根据简单的字节比较来缓存编译后的类的一个问题,例如使用Docker层缓存。理想情况下,可以被编译的第三方Clojure库可以存储在容器的单独Docker层中,以便在Clojure应用中使用。如果这样的层在给定的特定固定依赖关系集下产生了相同的字节输出,那么当推送到存储库时就可以识别出它已经存在。这将避免由于在您的应用程序代码中的每个源代码更改中都创建新的uberjar而导致的存储和网络成本。
当不使用AOT编译时可以实现这种缓存,但代价是应用程序启动速度变慢。