当使用maven-shade-plugin打包包含一些Clojure库和一些Java的jar工件时。我们使用AOT编译我们的Clojure代码。当我们加载jar时,它的加载时间非常慢。 AOT编译应该对此有所帮助,但这不是我们所看到的。 我们在java jar -verbose输出中注意到,当加载Clojure类时,发生了很多 JVM__DEFINE_CLASS 调用。
这没有意义,因为我们的Clojure代码中有更多是AOT编译为.class文件。
原来maven-shade-plugin创建所有新文件,在最终工件中使用新的 timestamps Clojure使用.clj文件中的时间戳信息与.class文件,以确定是否该文件需要重新编译。 maven-shade-plugin导致.clj文件及其关联的.class文件具有相同的时间戳,因此Clojure总是选择动态重新编译源。
我们现在能够弄清楚的唯一解决方法是编写一个脚本,重新打开阴影jar并将.clj文件的时间戳恢复到过去的某个时间,这样它们就可以了不等于其关联的.class文件的时间戳。
有谁知道更好的方法?
答案 0 :(得分:2)
不确定这是否更好,但您也可以选择从jar中排除clojure源。这将阻止它们被重新编译。我在使用lein进行构建并使用pack200进行压缩时遇到了这种情况。更多细节:
jar built with jwrapper doesn't work
不确定排除文件的maven选项,但是使用lein可以放入排除模式,例如#“。(clj | java)”以排除源文件。