如何防止JFrame / EXIT_ON_CLOSE杀死nrepl服务器?

时间:2013-04-10 03:35:01

标签: emacs clojure nrepl

编辑使用DISPOSE_ON_CLOSE不是我所追求的,因为我们遇到了“反向”问题:当我关闭JFrame(这很好)时,REPL保持活着状态当从REPL外部(这是坏的)开始时,保持活着。

我正在Clojure中编写一个Swing应用程序,我发现从REPL(Emacs下的 nrepl )和REPL外部测试东西都很方便(例如使用{{1}或者通过运行独立的 .jar )。

当我没有从REPL启动我的Swing应用程序时,我发现将默认关闭操作设置为EXIT_ON_CLOSE很方便。例如:

lein run

所以我可以点击JFrame的关闭按钮,完成我的应用程序。

然而显然(我可能对此有误,但我认为我没有看到的东西)从REPL运行时这是有问题的:一旦我点击JFrame的关闭按钮,我显然会杀死 nrepl < / em>服务器,必须重新打开一个新的 nrepl

知道我需要从 nrepl 和外部任何REPL进行测试,我该如何解决我的问题?

我应该“检测”我是从REPL运行然后没有设置默认关闭操作退出吗?或?

2 个答案:

答案 0 :(得分:0)

JFrame.EXIT_ON_CLOSE通过调用System.exit() terminates the currently running Java virtual machine来退出应用程序。由于您的应用程序和REPL都在同一个JVM中运行(因为您已经从REPL启动了应用程序),这意味着REPL也会被杀死。

相反,请尝试使用:

(.setDefaultCloseOperation jframe JFrame/DISPOSE_ON_CLOSE)

当您单击其关闭按钮时,这也将隐藏(和处置)JFrame,但保持您的JVM - 以及您的REPL - 正在运行。

答案 1 :(得分:0)

启动REPL时使用环境变量,并根据该变量选择是关闭还是退出onclose。

独立启动时,变量检查会失败,因此您可以在关闭时退出。

编辑:

在shell中:

export REPL_MODE=true ; lein repl

在clojure代码中:

(def repl-mode (System/getenv "REPL_MODE"))
(if (not (nil? repl-mode))
     ; in repl, set to dispose on close
     ; in standalone mode, set to exit on close