2014-12-07 13 views
12

Wenn ich rufeWarum lässt Leiningen eine eigene JVM laufen?

lein trampoline repl 

Leiningen seinen eigenen JVM-Prozess startet, der dann für die ers eine separate JVM startet und beendet. Wenn jedoch der Standardruf

aufgerufen wird, bleiben zwei JVMs aktiv. Gibt es einen Grund, den ursprünglichen JVM-Prozess von Leiningen am Laufen zu halten? Warum nicht lein trampoline Verhalten als Standard und jedes Mal beenden?

+0

Namensraumtrennung? http://www.flyingmachinestudios.com/programming/lein-trampoline/ – nha

+0

Das würde den Prozessbaum durchbrechen und verhindern, dass die Prozesse bereinigt werden, wenn etwas mit dem übergeordneten Prozess passiert, der gestartet wurde. – NielsK

+0

Es ist völlig klar, warum 'lein' eine separate JVM startet, es gibt viele Gründe dafür. Warum sollte die ursprüngliche JVM die ganze Zeit laufen? –

Antwort

6

lein help trampoline Zustände:

eine Aufgabe ausführen, ohne im Inneren Leiningen der des Projekts JVM nisten.

Berechnet den Clojure Code in den Projektprozess für die gegebene Aufgabe auszuführen und ermöglicht Leiningen eigene JVM-Prozess vor beenden es nicht startet eine subProzess von Leiningen JVM läuft.

Mit diesem Speicher zu speichern oder um stdin Probleme zu arbeiten.

Argumente: ([Task-Name & args])

So können Sie sehen, ohne trampoline läuft die zweite JVM als Teilprozess des ersten. Deshalb kann der Erste nicht aussteigen - der Ausstieg würde den Zweiten stören.

Auf der anderen Seite, mit trampoline die erste JVM konstruiert ein Shell-Skript, das dann von der Skript ausgeführt wird, um die zweite JVM zu spawnen. In diesem Fall ist die zweite JVM ein Kind des lein-Skripts. How Clojure Babies are Made: Leiningen's Trampoline deckt das ziemlich detailliert ab.

Wie, warum trampoline nicht der Standard ist, ich bin nicht ganz sicher. Beachten Sie jedoch, dass nicht jeder Befehl Projektcode ausführt, sodass die zweite JVM nicht für jeden Befehl benötigt wird.

Auch kann es Nachteile sein trampoline zu verwenden. Nehmen wir zum Beispiel einen Blick auf die folgenden Codezeilen aus dem obigen Artikel:

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

Für mich, das bedeutet, dass es Probleme geben könnte, wenn :target-pathist Satz in project.clj.

+0

Als ich das Kopfgeld startete, hoffte ich, noch mehr Gründe dafür zu finden, warum 'lein' seinen Hauptprozess nicht standardmäßig beendet. Persönlich glaube ich, dass 'lein' -Team" Trampolin "hinzugefügt hat, um seine Leistung zu steigern, aber ihm nie genug vertraut hat, um es zum" Lein "Standardverhalten zu machen, obwohl ich nichts zu beweisen habe. Wie auch immer, deine Antwort ist die beste und verdiene diese Prämie. –

0

Dies liegt daran, erste Instanz setzt die Umwelt und übergibt andere erforderliche Parameter an die realen Jvm, die auf am Laufen hält.

Die erste Instanz von JVM ist nur eine Art Wrapper, die für die Benutzer einfach ist, ansonsten muss der Benutzer all die Arbeit der Übergabe der erforderlichen Parameter an jedem Ausführungspunkt, die weder benutzerfreundlich noch aus der Sicht der Sicherheit gut aussieht.

+3

Warum sollte man das 'lein trampoline' Verhalten nicht zum Standard machen und jedes Mal aufhören? –

+0

Lesen Sie die Frage bitte. –

+0

Nun fragt die Frage ausdrücklich, "Gibt es einen Grund, den ursprünglichen Leiningen JVM-Prozess am Laufen zu halten?". Dies scheint das zu beantworten, oder? –

Verwandte Themen