當您使用leiningen創建Clojure項目時,所有* .clj文件都被編譯爲AOT。通常情況下,AOT編譯不是必需的,我想將其最小化。如何最小化Leiningen中的AOT編譯(Clojure)
這對於我提高Clojure接受度作爲Java主導環境的補充是必要的。將一個單獨的類文件作爲粘合劑與一些kB的clj文件一起「賣」出來,這樣更容易將250 kB以上的類文件替換爲奇怪的名稱,並在它們之間隱藏一個小小的clj文件在執行期間甚至不會再讀取)。
理想情況下,「lein compile」的結果只會是一個小的類文件(與clj-files和clojure-library一起)實現所需的類實例。
實現此目的的最簡單方法是什麼?我寧願不寫一行Java(當然)。從technomancy
反饋後
更新我不懷疑這是一個leiningen問題。讓我通過一個例子來解釋我的後果。請原諒這個例子的長度。我正在使用leiningen 1.3.1,但我認爲1.4.0-SNAPSHOOT的行爲方式相同。
$ lein new dummy
Created new project in: dummy
$ cd dummy
現在改變project.clj至(加入 「:主dummy.core」):
(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 /虛設/ core.clj到:
(ns dummy.core
(:gen-class))
(defn -main [& args]
(println "This is Clojure code, args=" args))
現在編譯它:
$ lein compile
Compiling dummy.core
這將生成以下文件在類/虛擬:
core.class
core__init.class
core$loading__4410__auto__.class
core$_main.class
這是正確的,我可以執行的結果:
$ java -cp lib/*:classes dummy.core Hello
This is Clojure code, args= (Hello)
現在來了,我想擁有,而不是什麼,但我做手工: 我可以刪除所有類的文件,除了core.class和副本的core.clj到類/虛擬現在看起來很空:
個$ ls classes/dummy/
core.class
core.clj
的core.class包含的代碼在運行時加載的core.clj,結果還是一樣,我仍然可以做:
$ java -cp lib/*:classes dummy.core Hello
This is Clojure code, args= (Hello)
我還可以修改core.clj(注:在類/ dummy!),當然,變化不需要重新編譯。
現在我的問題歸結爲:有沒有更簡單的方法來得到這個core.class?
我正在使用1.3.1。當然,leiningen不應該怪罪。然而,當我做「lein new dummy」時,用一些「defn」填充dummy/core.clj並向project.clj添加一個「:main dummy.core」,然後「lein compile」生成大量類文件。再次,這可能是正確的(lein從不錯!),但我想知道如何防止這種情況。 – jramb 2010-10-31 15:52:21
是的,你被Clojure bug#322咬了:https://www.assembla.com/spaces/clojure/tickets/322-enhance-aot-compilation-process-to-emit-classfiles-only-for-明確指定的命名空間Leiningen 1.4將包含解決此問題的解決方法。它應該在一週左右發佈;如果你更快需要它,你可以從git運行。 – technomancy 2010-10-31 16:58:04
感謝您的反饋,技術!我期待新版本。上面我試圖更詳細地解釋我希望完成的事情。儘管我明白錯誤#322與我的問題的關係,我希望我的解決起來更容易。 :-) – jramb 2010-10-31 17:46:00