【发布时间】:2016-04-15 12:15:26
【问题描述】:
我有一个使用 maven 作为构建工具的跨 Java-clojure 项目。需要对一些命名空间进行 AOT 编译。
问题是,编译需要很长时间才能完成。检查 maven 进程会得到以下观察结果:
- 编译时,CPU等待时间非常长(单核70-90%)。
-
对那个高等待线程进行采样会给出一个堆栈,其中最里面的调用是:
at java.io.FileDescriptor.sync(Native Method) at clojure.lang.Compiler.writeClassFile(Compiler.java:7269) - 检查
target/classes/文件夹,生成了大量.class文件,主要用于我的项目所依赖的基于clojure 的库。
我尝试过的:
- 指示 clojure-maven-plugin 只编译给定的命名空间。但沿依赖线的传播并未受到抑制。
- 明确包括给定的命名空间,并排除依赖的命名空间。依赖库仍由 AOT 进程重新编译。
好吧,就在我按下“POST”按钮之前,我发现了这个issue。似乎早在 5 年前我们就有过这样的讨论,而且问题并不特定于 clojure-maven-plugin。那么这个问题有什么新变化呢?在我的机器上为我的不那么大的项目使用一次mvn clean compile 大约需要 4 分钟,我可以真正地喝杯咖啡,高枕无忧..
如果问题在不久的将来无法以任何方式得到解决,有什么建议可以减轻我的痛苦?欢迎任何想法。
【问题讨论】:
-
只做“maven install”怎么样?
-
@dAni 需要注意的是 clean 部分。只要清理了编译的类文件,编译就会重新开始。虽然增量编译是可能的,但我们确实需要不时clean它..
-
Clojure 1.8 今天发布了 dev.clojure.org/jira/browse/CLJ-703。在我的一些项目中,我发现编译时间缩短了 33%。
-
@dAni 太棒了!这看起来确实是一个关键的性能提升。我会试一试并尽快报告。
-
选择 1.8 后,我的
mvn clean compile现在只用了 40 多秒!从 4 分钟开始!如果使用我的clean.sh,只需 20 多秒。
标签: clojure