If I call
lein trampoline repl
Leiningen launches its own JVM process which then starts a separate JVM for the repl and quits. However calling the default
lein repl
leaves two JVMs running. Is there any reason for keeping the original Leiningen JVM process running? Why not make lein trampoline behavior the default and quit every time?
lein help trampoline states:
Run a task without nesting the project's JVM inside Leiningen's.
Calculates the Clojure code to run in the project's process for the given task and allows Leiningen's own JVM process to exit before running it rather than launching a subprocess of Leiningen's JVM.
Use this to save memory or to work around stdin issues.
Arguments: ([task-name & args])
So you can see, without trampoline the second JVM runs as a sub-process of the first. That's why the first one can't exit — exiting would disrupt the second.
On the other hand, with trampoline the first JVM constructs a shell script which is then executed by the lein script to spawn the second JVM. So in this case, the second JVM is a child of the lein script. How Clojure Babies are Made: Leiningen's Trampoline covers this in quite a bit of detail.
As to why trampoline is not the default, I'm not entirely sure. But remember that not every lein command runs project code, so the second JVM is not needed for every command.
Also, there may be disadvantages to using trampoline. For example, take a look at the following lines of code from the above article:
# Just don't change :target-path in project.clj, mkay?
TRAMPOLINE_FILE="target/trampolines/$INPUT_CHECKSUM"
To me, that implies that there could be problems if :target-path is set in project.clj.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With