2014-12-07 22 views
12

如果我打電話Leiningen爲什麼保持自己的JVM運行?

lein trampoline repl 

Leiningen推出其自己的JVM進程,然後啓動一個獨立的JVM的REPL和退出。不過調用默認值

lein repl 

使兩個JVM運行。是否有任何理由讓原始的Leiningen JVM流程繼續運行?爲什麼不使lein trampoline行爲成爲默認行爲並每次退出?

+0

命名空間分離? http://www.flyingmachinestudios.com/programming/lein-trampoline/ – nha 2014-12-18 12:54:08

+0

這會破壞進程樹,阻止在啓動lein的父進程出現問題時清除進程。 – NielsK 2014-12-18 13:12:00

+0

這很清楚爲什麼'lein'啓動一個單獨的JVM,這裏有很多理由。爲什麼保持原始JVM一直運行? – 2014-12-19 13:17:35

回答

6

lein help trampoline狀態:

沒有嵌套項目的JVM Leiningen的內部運行任務。

計算Clojure的代碼,在項目的進程中運行的 給定的任務,並允許Leiningen自己的JVM進程運行它,而不是啓動Leiningen的JVM的一個子進程 之前退出。

使用它可以節省內存或解決stdin問題。

參數:([任務名稱&參數])

所以你可以看到,沒有trampoline第二JVM上運行的第一個的子進程。這就是爲什麼第一個不能退出的原因 - 退出會擾亂第二個。

另一方面,通過trampoline,第一個JVM構造一個shell腳本,然後由lein腳本執行該腳本以產生第二個JVM。因此,在這種情況下,第二個JVM是lein腳本的子代。 How Clojure Babies are Made: Leiningen's Trampoline涵蓋了很多細節。

至於爲什麼trampoline不是默認值,我不完全確定。但請記住,並非每個lein命令都運行項目代碼,因此每個命令都不需要第二個JVM。

此外,使用trampoline可能存在缺點。例如,看一看的代碼從上述文章中的以下行:

# Just don't change :target-path in project.clj, mkay? 
TRAMPOLINE_FILE="target/trampolines/$INPUT_CHECKSUM" 

對我來說,意味着可能有問題,如果:target-pathproject.clj

+0

開始賞金,我希望看到更多關於爲什麼'lein'沒有在默認情況下終止其主流程的推理。就我個人而言,我相信'lein'團隊增加了'trampoline'來提升它的表現,但從來沒有相信它足以讓它成爲'lein'的默認行爲,儘管我沒有任何證據證明它。無論如何,你的答案是最好的,值得這個獎勵。 – 2014-12-23 18:39:34

0

這是因爲第一個實例設置環境並將其他所需的參數傳遞給保持運行的真正的jvm。一旦JVM的一個實例只是一種爲用戶提供便利的包裝,否則用戶必須在每個執行點都做出傳遞所需參數的所有工作,這從安全角度來看既不友好也不好看。

+3

爲什麼不讓'lein trampoline'行爲成爲默認行爲並每次退出? – 2014-12-07 04:09:04

+0

請閱讀該問題。 – 2014-12-19 07:28:52

+0

嗯,這個問題明確地問:「是否有任何理由讓原始的Leiningen JVM進程繼續運行?」。這似乎回答,不是嗎? – 2014-12-20 19:02:45