我目前正在尝试学习 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 的理解/我的项目设置的“问题”。
我的问题是:为什么在运行和运行独立 JAR 时slurp
的(或程序的)行为不同,我能做些什么来解决这个问题?lein run
java -jar cat-0.1.0-SNAPSHOT-standalone.jar
由于文件参数不是编译到JAR中的资源,所以(slurp (clojure.java.io/resource filename))
如果我没记错的话,没有必要。