1

当以下 Clojure 示例程序被打包到一个独立的 uberjar(通过 boot-clj)中时,执行的java -jar app.jar行为与从-main开发 repl 中调用函数不同。

(ns bat-man.core
  (:require [clojure.java.shell :refer [sh]])
  (:gen-class))

(defn -main [& args]
  (prn (sh "echo" "test")))

发生的情况是,结果{:exit 0, :out "test\n", :err ""}会立即打印到stdout,但之后需要一段时间,可能是半分钟,直到程序真正退出。
情况并非如此,当程序被修改为只打印一些输出而没有调用时sh

在开发repl中,一切都如预期的那样,功能在打印后立即完成。如何解释/解决?

ps aux更新:这是程序正在花时间完成的同时拍摄的摘录:

unsername         8730  5.4  2.0 3643576 80052 pts/8   Sl+  13:25   0:01 java -jar /path/to/app.jar
4

1 回答 1

3

clojure.java.shell/shfuture在幕后使用 a ,因此您需要调用(shutdown-agents)以关闭后台线程。

于 2016-08-18T13:06:28.910 回答