4

当使用 maven-shade-plugin 打包包含一些 Clojure 库和一些 Java 的 jar 工件时。我们对 Clojure 代码使用 AOT 编译。当我们加载 jar 时,它的加载时间非常慢。AOT 编译应该对此有很大帮助,但这不是我们所看到的。我们在 java jar -verbose 输出中注意到在加载 Clojure 类时发生了很多JVM__DEFINE_CLASS调用。

这没有任何意义,因为我们的更多 Clo​​jure 代码被 AOT 编译为 .class 文件。

结果 maven-shade-plugin 创建了所有新文件,最终工件中带有新的时间戳Clojure 使用 .clj 文件与 .class 文件上的时间戳信息来确定文件是否需要重新编译。maven-shade-plugin 导致 .clj 文件及其关联的 .class 文件具有相同的时间戳,因此 Clojure 总是选择动态重新编译源代码。

在这一点上,我们能够弄清楚的唯一解决方法是编写一个脚本,该脚本将重新打开阴影 jar 并将 .clj 文件时间戳恢复到过去的某个时间,这样它们就不会等于它们关联的 .class 文件的时间戳。

有谁知道更好的方法?

4

1 回答 1

2

不确定这是否更好,但您也可以选择从 jar 中排除 clojure 源。这将防止它们被重新编译。我在使用 lein 构建并使用 pack200 压缩时遇到了这个问题。更多细节在这里:

用 jwrapper 构建的 jar 不起作用

不确定排除文件的 maven 选项,但使用 lein 您可以放入排除模式,例如 #".(clj|java)" 以排除源文件。

于 2014-12-10T23:41:51.987 回答