gpt4 book ai didi

Clojure: war 编译失败,缺少数据文件依赖

转载 作者:行者123 更新时间:2023-12-02 22:01:03 25 4
gpt4 key购买 nike

我正在开发一个网络应用程序,该应用程序依赖于在运行时被吞噬的特定数据文件。如果没有数据文件,我似乎无法编译。为什么是这样?

这是在我的 core.clj 中

(def my-data (slurp "my-file.txt"))

然后当我尝试编译时:

$ lein ring war

我得到这个异常

Exception in thread "main" java.io.FileNotFoundException: my-file.txt (No such file or directory), compiling:(core.clj:24:28)

如何编译我的 war ?我不需要文件被吞噬,甚至不需要在编译时检查文件是否存在。提前致谢!

[更新]

这不是特定于war文件打包或环,例如:

(ns slurp-test.core
(:gen-class))

(def x (slurp "/tmp/foo.txt"))

(defn -main [& args]
(println x))

然后:

 $ 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)

我该如何解决这个问题?

最佳答案

编译 Clojure 源文件涉及评估所有顶级表单。事实上,这对于支持预期的语义是绝对必要的——最值得注意的是,否则宏将无法正常工作1

如果您对代码进行 AOT 编译,将在编译时评估顶级表单,然后在加载编译代码时在运行时再次评估。

因此,在顶层代码中引起副作用通常不是一个好主意。如果应用需要初始化,则应由函数(通常是 -main)执行。


1 宏是存在于标记为宏的 Var 中的函数(在 Var 的元数据中使用 :macro true;有一个 setMacro 添加此条目的 clojure.lang.Var 上的方法)。宏必须清楚地对编译器可用,因此它们必须在编译时加载。此外,在计算展开时,宏函数可能想要调用非宏函数或以其他方式使用任意 Vars 的值,这些 Vars 是通过评估在调用宏的点之前发生的任何顶级代码而产生的。删除这些功能会严重削弱宏功能。

关于Clojure: war 编译失败,缺少数据文件依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16929888/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com