SBT-Stopplauf ohne Beenden

120

Wie kann man einen Lauf in SBT beenden, ohne ihn zu beenden?

Ich versuche STRG + C, aber es beendet SBT. Gibt es eine Möglichkeit, die laufende Anwendung nur zu beenden, während SBT geöffnet bleibt?

dsg
quelle
Ctrl+Dfunktioniert nicht.
Botchniaque
Ich denke, Ctrl + Dfunktioniert nur für Play Framework.
EnverOsmanov

Antworten:

44

In der Standardkonfiguration werden Ihre Läufe in derselben JVM ausgeführt, in der sbt ausgeführt wird, sodass Sie sie nicht einfach separat beenden können.

Wenn Sie Ihren Lauf in einer separaten, gegabelten JVM ausführen, wie unter Forking beschrieben , können Sie diese JVM (auf jede von Ihrem Betriebssystem angebotene Weise) beenden, ohne die JVM von sbt zu beeinträchtigen:

fork in run := true
Seth Tisue
quelle
9
Ich versuche das zu tun. Insbesondere habe ich Folgendes implementiert: stackoverflow.com/questions/3868863/…, aber sbt wird immer noch beendet, wenn ich STRG + C mache. Wie töte ich nur die gegabelte JVM?
dsg
2
mit killüber die Befehlszeile oder im Task-Manager (Windows) oder Force Quit oder Activity Monitor (Mac OS X) usw.
Seth Tisue
Führen Sie nach dem Gabeln, um alles Java außer sbt zu töten, aus:kill -9 `ps -h | grep java | grep -v sbt-launch | grep -v grep | awk '{print $1}'`
dsg
1
Ich liebe diese Idee, aber sie scheint nicht zu helfen. Ich führe sbt 0.13.1 aus und füge diese Zeile meiner build.sbt-Datei hinzu.
Doub1ejack
Sie müssen die runmit STRG + D
Timofey
82

Ab sbt Version 0.13.5 können Sie Ihre build.sbt hinzufügen

cancelable in Global := true

Es ist definiert als "Aktiviert (true) oder deaktiviert (false) die Fähigkeit, die Taskausführung mit STRG + C zu unterbrechen." in der Schlüsseldefinition

Wenn Sie Scala 2.12.7+ verwenden, können Sie die Kompilierung auch mit STRG + C abbrechen. Referenz https://github.com/scala/scala/pull/6479

Es wurden einige Fehler gemeldet:

Jonas Anso
quelle
5

Ich habe Folgendes nützlich gefunden, wenn ich die Kontrolle über die Hauptschleife der Anwendung habe, die von sbt ausgeführt wird.

Ich sage sbt, dass es beim Ausführen der Anwendung (in build.sbt) gegabelt werden soll:

fork in run := true

Ich fordere sbt außerdem auf, stdin von der sbt-Shell an die Anwendung weiterzuleiten (in build.sbt):

connectInput in run := true

Schließlich warte ich im Hauptthread der Anwendung auf das Dateiende auf stdin und schalte dann die JVM aus:

while (System.in.read() != -1) {}
logger.warn("Received end-of-file on stdin. Exiting")
// optional shutdown code here
System.exit(0)

Natürlich können Sie jeden Thread zum Lesen von stdin und shutdown verwenden, nicht nur den Haupt-Thread.

Starten Sie abschließend sbt und wechseln Sie optional zu dem Teilprojekt, das Sie ausführen möchten.

Wenn Sie den Prozess jetzt stoppen möchten, schließen Sie den Standard, indem Sie STRG-D in die sbt-Shell eingeben.

Kilo
quelle
1

Erwägen Sie die Verwendung von sbt-revolver . Wir verwenden es in unserer Firma und es ist wirklich praktisch. Für was Sie fragen, können Sie tun mit:

reStart

reStop

Ohne die Datei build.sbt konfigurieren zu müssen.

Sie können dieses Plugin verwenden, indem Sie Folgendes hinzufügen:

addSbtPlugin("io.spray" % "sbt-revolver" % "0.9.1")

Zu Ihrem Projekt / plugins.sbt

mtsokol
quelle