2016-08-14 1 views
2

J'apprends clojure avec leiningen. J'ai écrit un code simple pour tester lein & commandes java -jar. Voici mon project.clj fichier:Pourquoi la fonction d'impression ne s'imprime pas lorsqu'elle est appelée avec java -jar?

$ cat project.clj 
(defproject hello "0.1.0-SNAPSHOT" 
    :description "FIXME: write description" 
    :url "http://example.com/FIXME" 
    :license {:name "Eclipse Public License" 
      :url "http://www.eclipse.org/legal/epl-v10.html"} 
    :dependencies [[org.clojure/clojure "1.8.0"]] 
    :main ^:skip-aot hello.core 
    :target-path "target/%s" 
    :profiles {:uberjar {:aot :all}}) 

Voici mon code source:

$ cat src/hello/core.clj 
(ns hello.core 
    (:gen-class)) 

(defn -main 
    [& args] 
    (print "Hello, World!")) 

Quand je lance ce code avec lein, ça marche très bien. Il est montré ici

$ lein run 
Hello, World!$ 

Quand j'ai essayé d'exécuter java jar, il n'a pas fonctionné

$ lein uberjar 
Compiling hello.core 
Created /home/rishi/hello/target/uberjar/hello-0.1.0-SNAPSHOT.jar 
Created /home/rishi/hello/target/uberjar/hello-0.1.0-SNAPSHOT-standalone.jar 

$ java -jar target/uberjar/hello-0.1.0-SNAPSHOT-standalone.jar 

Je ne comprends pas, pourquoi je ne me suis pas sortie nécessaire avec java -jar?

Si je remplace impression avec println dans le fichier source, je suis sortie nécessaire à la fois lein run & java jar.

Répondre

4

Votre sortie de processus est mise en mémoire tampon. print ne vide pas la sortie. La plupart du temps, votre flux de sortie sera configuré pour vider automatiquement les retours à la ligne, ce qui explique pourquoi les écrans println s'affichent. Si vous avez besoin de vider sans nouvelle ligne, vous pouvez appeler la fonction (flush).

+0

Cool! J'ai compris. J'ai eu ma réponse. Merci. @noisesmith –