我有一个lein项目(使用cascalog——但这并不是特别重要)。我正在尝试将像文件路径这样的属性外部化,以便最终得到类似于这样的代码:
(defn output-tap [path] (hfs-textline (str (get-prop :output-path-prefix) path) :sinkmode :replace))
(def some-cascalog-query
(<- [?f1 ?f2 ?f3]
((output-tap (get-prop :output-path)) ?line)
(tab-split ?line :> ?f1 ?f2 ?f3)))
在上面的例子中,假设函数
get-prop
已经存在;它只是使用标准的Java读取属性值(基于此示例:将配置文件作为数据结构在Clojure中加载)。现在我有一个主方法来加载属性值,例如:
(defn -main [& args] (do (load-props (first args)) (do-cascalog-stuff)))
但是当我运行lein uberjar
时,会出现编译时错误,内容如下:
Caused by: java.lang.IllegalArgumentException: Can not create a Path from an empty string
at org.apache.hadoop.fs.Path.checkPathArg(Path.java:82)
at org.apache.hadoop.fs.Path.<init>(Path.java:90)
at cascading.tap.hadoop.Hfs.getPath(Hfs.java:343)
def 是否总是在编译时评估(而不是运行时评估)?还是我误解了这个错误?