【问题标题】:Different slurp behavior with "lein run" and running the uberjar file使用“lein run”和运行 uberjar 文件的不同 slurp 行为
【发布时间】:2016-07-22 07:41:06
【问题描述】:

我目前正在尝试学习 Clojure,作为我实践培训的一部分,我 实现一些众所周知的 Unix 工具(如 grep)的非常基本的行为, catls 等等。

在实现cat 时,我偶然发现了一些看似奇怪的行为 slurp。当我使用lein run some-file.txtsome-file.txt 运行以下代码时 位于当前目录中,内容按预期打印到 STDOUT。

(ns cat.core
  (:gen-class))

(defn -main
  "Reads the content of its arguments representing filenames and outputs the
  content in succession."
  [& filenames]
  (doseq [filename filenames]
    (println "Reading" filename) ; Just for debugging purposes
    (print (slurp filename))))

但是,如果我 uberjar 项目与

lein compile
lein uberjar

然后 cdtarget/uberjar 运行独立 JAR java -jar cat-0.1.0-SNAPSHOT-standalone.jar some-file.txt(该目录中存在文本文件), 只有我的调试消息被打印出来。我觉得很奇怪的是没有错误 正在显示消息,因此在我看来可以找到该文件。如果我运行 带有不存在作为参数的文件的 JAR,我得到一个指定的异常 找不到文件(如预期的那样)。

因为我在 Windows 机器上工作,一位同事建议可能是 Windows 影子文件可能是个问题。于是我又在Linux下测试了这个程序,结果 发生了同样的行为。所以这似乎是我对 Clojure 的理解/我的项目的一个“问题” 设置。

我的问题是:为什么 slurp 的(或程序的)在运行时的行为不同 使用 lein run 并使用 java -jar cat-0.1.0-SNAPSHOT-standalone.jar 运行独立 JAR 时,我该怎么做才能解决这个问题?

由于文件参数不是编译成JAR的资源,所以没有 如果我没记错的话,需要(slurp (clojure.java.io/resource filename))

【问题讨论】:

    标签: clojure leiningen uberjar


    【解决方案1】:

    print 不会刷新输出缓冲区。您需要在print 语句之后使用flush,或者使用另一个println,它会在换行符上刷新:

    (defn -main
      "Reads the content of its arguments representing filenames and outputs the
      content in succession."
      [& filenames]
      (doseq [filename filenames]
        (print (slurp filename))
        (flush)))
    

    【讨论】:

    • 为了完全模仿cat的行为,我会选择使用flush而不是printlncat不会在输出后插入额外的换行符)
    • 同意!我编辑显示flush 而不是println。谢谢,@OlegTheCat
    猜你喜欢
    • 2016-06-06
    • 2012-10-07
    • 2016-03-25
    • 2015-11-21
    • 1970-01-01
    • 2016-11-09
    • 2016-02-12
    • 1970-01-01
    • 2012-06-01
    相关资源
    最近更新 更多