如果我打电话
lein trampoline repl
Leiningen启动自己的JVM进程,然后为repl启动一个单独的JVM并退出。但是调用默认
lein repl
运行两个JVM。是否有任何理由保持原始的Leiningen JVM进程运行?为什么不将lein trampoline
行为设为默认行为并且每次都退出?
答案 0 :(得分:6)
lein help trampoline
州:
运行任务而不将项目的JVM嵌套在Leiningen的内部。
计算要在项目的流程中运行的Clojure代码 给定任务并允许Leiningen自己的JVM进程退出之前 运行它而不是启动Leiningen的JVM的子流程。
使用它来节省内存或解决stdin问题。
参数:([task-name& args])
所以你可以看到,没有trampoline
第二个JVM作为第一个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-path
中设置project.clj
,可能会出现问题。
答案 1 :(得分:0)
这是因为第一个实例设置环境并将其他必需参数传递给继续运行的真实jvm。
JVM的第一个实例只是一种易于用户使用的包装器,否则用户必须在每个执行点完成所有传递所需参数的工作,从安全的角度来看,这既不是用户友好也不好看。 / p>