当使用 maven-shade-plugin 打包包含一些 Clojure 库和一些 Java 的 jar Artifact 时。我们对 Clojure 代码使用 AOT 编译。当我们加载 jar 时,它的加载时间非常慢。 AOT 编译应该对此有很大帮助,但那不是我们所看到的。 我们注意到在 java jar -verbose 输出中,加载 Clojure 类时发生了很多 JVM__DEFINE_CLASS 调用。
这没有意义,因为我们的更多 Clojure 代码被 AOT 编译为 .class 文件。
事实证明,maven-shade-plugin 创建了所有新文件,并在最终 Artifact 中使用了新的时间戳 Clojure 使用 .clj 文件与 .class 文件的时间戳信息来确定是否该文件需要重新编译。 maven-shade-plugin 导致 .clj 文件及其关联的 .class 文件具有相同时间戳,因此 Clojure 始终选择动态重新编译源。
在这一点上,我们能够找出的唯一解决方法是编写一个脚本来重新打开阴影 jar 并将 .clj 文件时间戳返回到过去的某个时间,以便它们不会等于它们关联的 .class 文件的时间戳。
有人知道更好的方法吗?
最佳答案
不确定这是否更好,但您也可以选择从 jar 中排除 clojure 源。这将防止它们被重新编译。我在用 lein 构建并用 pack200 压缩时遇到了这个问题。此处有更多详细信息:
jar built with jwrapper doesn't work
不确定用于排除文件的 Maven 选项,但是使用 lein 你可以放入一个排除模式,比如 #".(clj|java)"来排除源文件。
关于java - 通过 Maven Shade 插件构建着色 jar 时保留 Clojure .clj 文件的时间戳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19594360/