为什么Leiningen保持自己的JVM运行?

Mat*_*loy 12 jvm clojure leiningen

如果我打电话

lein trampoline repl
Run Code Online (Sandbox Code Playgroud)

Leiningen启动自己的JVM进程,然后为repl启动一个单独的JVM并退出.但是调用默认值

lein repl
Run Code Online (Sandbox Code Playgroud)

留下两个运行的JVM.是否有任何理由保持原始的Leiningen JVM进程运行?为什么不将lein trampoline行为设为默认行为并且每次都退出?

Nat*_*vis 6

lein help trampoline 状态:

在没有将项目的JVM嵌入Leiningen的情况下运行任务.

计算在给定任务的项目进程中运行的Clojure代码,并允许Leiningen自己的JVM进程在运行之前退出,而不是启动Leiningen的JVM的子进程.

使用它来节省内存或解决stdin问题.

参数:([task-name&args])

所以你可以看到,没有trampoline第二个JVM作为第一个子进程运行.这就是为什么第一个不能退出的原因 - 退出会破坏第二个.

另一方面,trampoline第一个JVM构造一个shell脚本,然后由lein脚本执行以生成第二个JVM.所以在这种情况下,第二个JVM是lein脚本的子代. Clojure婴儿是如何制作的:Leiningen的Trampoline在很多细节上都涵盖了这一点.

至于为什么trampoline不是默认值,我不完全确定.但请记住,并非每个lein命令都运行项目代码,因此每个命令都不需要第二个JVM.

此外,使用可能存在缺点trampoline.例如,看看上面文章中的以下代码行:

# Just don't change :target-path in project.clj, mkay?
TRAMPOLINE_FILE="target/trampolines/$INPUT_CHECKSUM"
Run Code Online (Sandbox Code Playgroud)

对我来说,这意味着,如果有可能的问题:target-path 在设置project.clj.