私は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に構成ファイルをロードします)。
これで、プロパティ値をロードするmainメソッドができました。たとえば、次のようになります。
(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は常に(実行時ではなく)コンパイル時に評価されますか?それとも私はこのエラーを誤解していますか?