How can i minimize the AOT compilation in leiningen (Clojure)
当您使用leiningen创建Clojure项目时,所有* .clj文件都将被AOT编译。通常,不需要AOT编译,我希望将其最小化。
对于我来说,提高Clojure作为Java主导环境中的补充的接受度是必要的。将单个类文件作为胶水与几个kB clj文件一起"出售"会比较容易,而不是使用250个以上带有奇怪名称的kB类文件并在其中隐藏一个小clj文件(这不是在执行过程中甚至再也读不到)。
理想情况下," lein编译"的结果将只是一个小的类文件(与clj文件和clojure库一起)实现所需的类实例。
最简单的方法是什么?我宁愿不写一行Java(当然)。
在获得技术反馈后进行更新
我不认为这是一个列宁根问题。让我用一个例子解释我的追求。请原谅示例的长度。我正在使用leiningen 1.3.1,但我认为1.4.0-SNAPSHOOT的行为方式相同。
1 2 3 | $ lein new dummy Created new project in: dummy $ cd dummy |
现在将project.clj更改为(添加了":main dummy.core"):
1 2 3 4 5 | (defproject dummy"1.0.0-SNAPSHOT" :description"FIXME: write" :dependencies [[org.clojure/clojure"1.2.0"] [org.clojure/clojure-contrib"1.2.0"]] :main dummy.core) |
和src / dummy / core.clj到:
1 2 3 4 | (ns dummy.core (:gen-class)) (defn -main [& args] (println"This is Clojure code, args=" args)) |
现在编译它:
1 2 | $ lein compile Compiling dummy.core |
这将在class / dummy中生成以下文件:
1 2 3 4 | core.class core__init.class core$loading__4410__auto__.class core$_main.class |
都是正确的,我可以执行结果:
1 2 | $ java -cp lib/*:classes dummy.core Hello This is Clojure code, args= (Hello) |
现在出现了我想拥有的东西,但是我手动进行:
我可以删除除core.class之外的所有类文件,并将core.clj复制到现在看起来很空的classes / dummy中:
1 2 3 | $ ls classes/dummy/ core.class core.clj |
core.class包含在运行时加载core.clj的代码,结果仍然相同,我仍然可以这样做:
1 2 | $ java -cp lib/*:classes dummy.core Hello This is Clojure code, args= (Hello) |
我还可以修改core.clj(注意:在类/虚拟对象中!),当然,不需要重新编译更改。
现在,我的问题可以归结为:是否有一种更简单的方法来获取此core.class?
莱宁根(Leiningen)在相当长的时间内默认未进行AOT; 也许您有旧版本? 但是有一个新功能(在1.4.0-SNAPSHOT中)可以确保在创建jar之前删除由于传递AOT而创建的.class文件(请参阅Clojure assembla#322),这也会引起您的兴趣。