Ich versuche gerade Clojure zu lernen und als Teil meines praktischen Trainings bin ich und implementiere das grundlegende Verhalten einiger der bekannten Unix-Tools wie grep
, cat
, ls
und so weiter.Unterschiedliches Schlürfverhalten mit "lein run" und Ausführen der Uberjar-Datei
Bei der Implementierung cat
stolperte ich über ein scheinbar seltsames Verhalten von slurp
. Wenn ich den folgenden Code mit lein run some-file.txt
ausführen, während some-file.txt
im aktuellen Verzeichnis liegt, wird der Inhalt wie erwartet auf STDOUT gedruckt.
(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))))
Wenn ich jedoch uberjar
das Projekt mit
lein compile
lein uberjar
und dann cd
zu target/uberjar
den Standalone-JAR mit java -jar cat-0.1.0-SNAPSHOT-standalone.jar some-file.txt
(mit der Textdatei in diesem Verzeichnis) laufen, nichts anderes als meine Debug-Nachricht wird gedruckt. Was ich so seltsam finde, ist, dass keine Fehlermeldung Nachricht angezeigt wird, so scheint es mir, dass die Datei gefunden werden kann. Wenn ich die JAR mit einer Datei ausführen, die nicht als Parameter existiert, bekomme ich eine Ausnahme, dass die angegebene Datei (wie erwartet) nicht gefunden werden kann.
Da ich an einer Windows-Maschine arbeite, schlug ein Kollege vor, dass möglicherweise Windows Shadow-Dateien ein Problem sein könnten. Also habe ich das Programm erneut unter Linux getestet und das gleiche Verhalten ist aufgetreten. Das scheint also ein "Problem" mit meinem Clojure Verständnis/meinem Projekt Einstellungen zu sein.
Meine Frage ist: Warum ist slurp
‚s (oder das Programm) Verhalten anders, wenn mit lein run
und beim Ausführen des eigenständigen JAR mit java -jar cat-0.1.0-SNAPSHOT-standalone.jar
läuft und was kann ich tun, diese zu lösen?
Da der Dateiparameter keine Ressource ist, die in das JAR kompiliert wird, gibt es keine Notwendigkeit für (slurp (clojure.java.io/resource filename))
, wenn ich mich nicht irre.
Um Mimik voll 'cat' Verhalten, würde ich wählen' verwenden flush' statt ' println' ('cat' fügt nach Ausgabe keine zusätzlichen Zeilenumbrüche ein) – OlegTheCat
Einverstanden! Ich habe bearbeitet, um den 'flush' anstelle des' println' zu zeigen. Danke, @OlegTheCat –