与" lein run"不同的啜饮行为。并运行uberjar文件

时间:2016-04-02 14:07:19

标签: clojure leiningen uberjar

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

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

uberjar

但是,如果我lein compile lein uberjar 项目

cd

然后target/uberjarjava -jar cat-0.1.0-SNAPSHOT-standalone.jar some-file.txt运行独立的JAR slurp(该目录中存在文本文件), 除了我的调试信息之外什么也没打印我发现很奇怪的是没有错误 消息显示,所以在我看来,可以找到该文件。如果我跑了 JAR用一个不存在的文件作为参数,我得到一个指定的exeption 无法找到文件(正如预期的那样)。

因为我在Windows机器上工作,所以同事建议也许是Windows 影子文件可能有问题。所以我再次测试了Linux下的程序 发生了相同的行为。所以这似乎是一个问题"与我的Clojure理解/我的项目 设置。

我的问题是:为什么lein run(或程序的)行为在运行时会有所不同 使用java -jar cat-0.1.0-SNAPSHOT-standalone.jar以及使用(slurp (clojure.java.io/resource filename))运行独立JAR时,我该怎么做才能解决此问题?

由于file参数不是编译到JAR中的资源,因此没有 如果我没有弄错的话需要public void walk(String path) { try (Stream<Path> allFiles = Files.walk(Paths.get(path))) { allFiles.filter(path -> path.toString().endsWith(".txt")) .forEach(System.out::println); } }

1 个答案:

答案 0 :(得分:3)

print不会刷新输出缓冲区。您需要在flush语句后使用print,或使用其他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)))