lein使jline3终端变得愚蠢

时间:2019-06-02 15:06:27

标签: clojure leiningen jline3

我通过lein获得了一个哑终端,而我通过uberjar获得了一个非哑终端。 lein怎么做导致此问题以及如何解决?这是在Win 10终端上发生的

我的项目依赖项:

:dependencies [[org.clojure/clojure "1.9.0"]
               [org.jline/jline "3.11.0"]
               [org.fusesource.jansi/jansi "1.18"]]

主要功能:

(defn -main
  [& args]
  (let [term (.. (TerminalBuilder/builder)
                 (system true)
                 (build))
        reader (.. LineReaderBuilder
                   (builder)
                   (terminal term)
                   (build))]
    (println (.getName term) (.getType term))
    (let [line (.readLine reader "hello world> ")]
      (.. term (writer) (println (str "====> " line)))
      (.flush term))))

通过lein run,我得到了一个哑终端:

> lein run
Jun 02, 2019 11:58:20 AM org.jline.utils.Log logr
WARNING: Unable to create a system terminal, creating a dumb terminal (enable debug logging for more information)
JLine terminal dumb
hello world> hi
====> hi

通过uberjar终端不傻:

> lein uberjar
...

> java -jar target\uberjar\terminal-0.1.0-SNAPSHOT-standalone.jar
JLine terminal windows-vtp
hello world> hi
====> hi

1 个答案:

答案 0 :(得分:1)

Leiningen启动了自己的JVM以读取project.clj等,然后lein run为您的项目启动了一个新的JVM。然后,lein JVM委托给您的。我怀疑JLine正确地检测到它的stdin不是一个终端,而是来自lein JVM的管道。

如果您想让lein摆脱困境,可以使用lein trampoline runtrampoline的工作是预先计算所有需要完成的任务,并将这些任务写入要在关闭Lein JVM之后执行的Shell脚本中。