Dav*_*ams 2 slurp clojure filenotfoundexception leiningen
我正在开发一个依赖于某个数据文件的webapp,它在运行时会被混淆.没有数据文件,我似乎无法编译.为什么是这样?
这是我的core.clj
(def my-data (slurp "my-file.txt"))
Run Code Online (Sandbox Code Playgroud)
然后当我尝试编译时:
$ lein ring war
Run Code Online (Sandbox Code Playgroud)
我得到了这个例外
Exception in thread "main" java.io.FileNotFoundException: my-file.txt (No such file or directory), compiling:(core.clj:24:28)
Run Code Online (Sandbox Code Playgroud)
我该怎么编译我的战争?我不需要在编译时篡改文件甚至检查是否存在.提前致谢!
[UPDATE]
这不是特定于war文件打包或响铃,例如:
(ns slurp-test.core
(:gen-class))
(def x (slurp "/tmp/foo.txt"))
(defn -main [& args]
(println x))
Run Code Online (Sandbox Code Playgroud)
然后:
$ lein uberjar
Compiling slurp-test.core
(ns slurp-test.core
Exception in thread "main" java.io.FileNotFoundException: /tmp/foo.txt (No such file or directory), compiling:(core.clj:4:8)
Run Code Online (Sandbox Code Playgroud)
我怎样才能解决这个问题?
编译Clojure源文件涉及评估所有顶级表单.事实上,这对于支持预期的语义是非常必要的 - 最值得注意的是,宏无法正常工作1.
如果AOT编译代码,顶级表单将在编译时进行评估,然后在运行时再次加载编译代码.
因此,在顶级代码中引起副作用通常不是一个好主意.如果应用程序需要初始化,则应由函数(通常-main)执行.
1宏是一个生活在Var中的函数,标记为宏(:macro true在Var的元数据中;有一个setMacro方法clojure.lang.Var可以添加此条目).宏必须清晰可供编译器使用,因此必须在编译时加载它们.此外,在计算扩展时,宏函数可能想要调用非宏函数或以其他方式利用由于评估在调用宏之前发生的任何顶级代码而产生的任意Vars的值.删除这些功能会严重削弱宏设施.