clojure.java.shell/sh在新线程中运行时抛出RejectedExecutionException

时间:2011-08-31 15:05:50

标签: clojure leiningen

在一个新的leiningen项目中,其core.clj包含

(defn show-cmd
  []
  (-> (shell/sh "ls")
    :out
    println))

(defn -main
  []
  (.start (Thread. show-cmd)))

有关完整图片,请参阅https://gist.github.com/1183753

因此,当我在上述项目中执行lein run时,会抛出RejectedExecutionException。完整的堆栈跟踪在主旨中。

但是,当放入.clj文件并直接使用clojure运行时,上述工作正常,在工作流程中没有leiningen。这是leiningen / clojure中的一个错误还是仅仅是我?

如果是一个错误,请告诉我如何让有关人员知道,因为这是我第一次发现错误:)

感谢。

更新以@skuro的建议为例,我尝试了leiningen的主分支克隆的例子,但我仍然得到同样的错误,如图所示

Leiningen error

3 个答案:

答案 0 :(得分:1)

这是Leiningen的一个已知问题,不幸的是won't be fixed soon。修复它会导致其他东西破裂。解决方法是强制主函数永不返回:

(defn -main
  []
  (.start (Thread. show-cmd))
  @(promise))

在这里,由于承诺永远不会实现,主要将永远等待,从而阻止雷宁根关闭经营代理人,期货等的执行人员。

答案 1 :(得分:0)

您需要升级到最新且最好的leiningen版本,可能是从源代码编译的。 leiningen有known bug,可以防止线程被正确执行。关于该主题还有other questions,搜索可能有所帮助。

答案 2 :(得分:0)

我已经看到这与通过leiningen运行时无法打开标准输入和错误有关。为了解决这个问题,我使用了

lein uberjar && java -jar projectstandalone.jar args.

它有点慢但工作