【发布时间】:2016-07-22 07:41:06
【问题描述】:
我目前正在尝试学习 Clojure,作为我实践培训的一部分,我
实现一些众所周知的 Unix 工具(如 grep)的非常基本的行为,
cat、ls 等等。
在实现cat 时,我偶然发现了一些看似奇怪的行为
slurp。当我使用lein run some-file.txt 而some-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
然后 cd 到 target/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))。
【问题讨论】: