私は現在Clojureを習得しようとしていて、 grep
のようなよく知られたUnixツールの非常に基本的な動作を実装しています。 cat
,ls
など。"lein run"とslaperの動作が異なり、uberjarファイルを実行しています
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))))
、私は(そのディレクトリ内のテキストファイルの存在を) java -jar cat-0.1.0-SNAPSHOT-standalone.jar some-file.txt
でスタンドアロンJARを実行するために
lein compile
lein uberjar
、その後target/uberjar
にcd
でプロジェクトをuberjar
場合は、私が、 何もデバッグメッセージが表示されます。私が奇妙なのは、エラーメッセージ が表示されているということです。ファイルが見つかったようです。パラメータとして存在しないファイルで JARを実行すると、指定した ファイルが(期待通りに)見つからないという例外が発生します。
私はWindowsマシンで作業しているため、同僚はおそらくWindows のシャドウファイルが問題である可能性があると示唆していました。だから私はLinuxでプログラムを再度テストし、 同じ動作が発生しました。だから、これは私のClojure理解/私のプロジェクト 設定の "問題"と思われます。
私の質問は:なぜlein run
と を実行するときにslurp
年代(またはプログラムの)動作が異なっており、java -jar cat-0.1.0-SNAPSHOT-standalone.jar
スタンドアロンJARを実行しているとき、私はこの問題を解決するために何ができるのでしょうか?
ファイルパラメータがJARにコンパイルされたリソースではないため、私が間違っていない場合は、(slurp (clojure.java.io/resource filename))
には の必要はありません。
完全に模倣 'cat'の動作するために:あなたは、あなた
print
文の後flush
を使用するか、改行にフラッシュする別のprintln
を、使用する必要がありますprintln'( 'cat'は出力後に改行を挿入しません) – OlegTheCat合意しました!私は 'println'の代わりに' flush'を表示するように編集しました。ありがとう、@OlegTheCat –