2010-10-31 39 views
2

當您使用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?

回答

4

Leiningen目前在默認情況下沒有進行AOT操作;也許你有一箇舊版本?但是有一個新特性(在1.4.0-SNAPSHOT中)可以確保由於傳輸AOT而創建的.class文件在創建jar之前被刪除(請參閱Clojure叢集#322),這也可能會引起您的興趣。

+0

我正在使用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

+0

是的,你被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

+0

感謝您的反饋,技術!我期待新版本。上面我試圖更詳細地解釋我希望完成的事情。儘管我明白錯誤#322與我的問題的關係,我希望我的解決起來更容易。 :-) – jramb 2010-10-31 17:46:00