2010-12-30 10 views
13

के साथ कमांड लाइन तर्क मैंने हाल ही में क्लोजर के साथ शुरुआत की है, और मैं एक छोटी परियोजना बनाने के लिए लीनिंगन का उपयोग कर रहा हूं। मुझे कमांड लाइन तर्कों के साथ व्यवहार करने के लिए leiningen प्राप्त करने में परेशानी हो रही है। निम्नलिखित है मेरी src/project/core.cljलीनिंगेन

(ns project.core 
    (:gen-class)) 

(defn -main [& args] 
    (println (apply str args))) 

और मेरे project.clj

(defproject project "1.0.0-SNAPSHOT" 
    :description "FIXME: write" 
    :main project.core 
    :dependencies [[org.clojure/clojure "1.2.0"] 
       [org.clojure/clojure-contrib "1.2.0"]]) 

अब जब मैं lein run arg1 arg2 चलाने के लिए, यह मुझे इस त्रुटि देता है:

Exception in thread "main" java.lang.Exception: Unable to resolve symbol: arg1 in this context (NO_SOURCE_FILE:1) 
    at clojure.lang.Compiler.analyze(Compiler.java:5205) 
    at clojure.lang.Compiler.analyze(Compiler.java:5151) 
    at clojure.lang.Compiler$InvokeExpr.parse(Compiler.java:3057) 
    at clojure.lang.Compiler.analyzeSeq(Compiler.java:5371) 
    at clojure.lang.Compiler.analyze(Compiler.java:5190) 
    at clojure.lang.Compiler.analyze(Compiler.java:5151) 
    at clojure.lang.Compiler$BodyExpr$Parser.parse(Compiler.java:4670) 
    at clojure.lang.Compiler$FnMethod.parse(Compiler.java:4328) 
    at clojure.lang.Compiler$FnExpr.parse(Compiler.java:3173) 
    at clojure.lang.Compiler.analyzeSeq(Compiler.java:5367) 
    at clojure.lang.Compiler.analyze(Compiler.java:5190) 
    at clojure.lang.Compiler.eval(Compiler.java:5421) 
    at clojure.lang.Compiler.eval(Compiler.java:5415) 
    at clojure.lang.Compiler.eval(Compiler.java:5391) 
    at clojure.core$eval.invoke(core.clj:2382) 
    at clojure.main$eval_opt.invoke(main.clj:235) 
    at clojure.main$initialize.invoke(main.clj:254) 
    at clojure.main$null_opt.invoke(main.clj:279) 
    at clojure.main$main.doInvoke(main.clj:354) 
    at clojure.lang.RestFn.invoke(RestFn.java:422) 
    at clojure.lang.Var.invoke(Var.java:369) 
    at clojure.lang.AFn.applyToHelper(AFn.java:165) 
    at clojure.lang.Var.applyTo(Var.java:482) 
    at clojure.main.main(main.java:37) 
Caused by: java.lang.Exception: Unable to resolve symbol: arg1 in this context 
    at clojure.lang.Compiler.resolveIn(Compiler.java:5677) 
    at clojure.lang.Compiler.resolve(Compiler.java:5621) 
    at clojure.lang.Compiler.analyzeSymbol(Compiler.java:5584) 
    at clojure.lang.Compiler.analyze(Compiler.java:5172) 
    ... 23 more 

हालांकि, अगर मैं एक lein uberjar और उसके बाद करना java -jar project-1.0.0-SNAPSHOT-standalone.jar arg1 arg2 करें, मुझे सही आउटपुट मिलता है।

arg1arg2 

विकास के दौरान हर बार इसे चलाने के लिए uberjar बनाने के लिए बहुत सहज नहीं है, क्या कोई बेहतर तरीका है?

+0

लीन रन प्रोजेक्ट .core arg1 arg2 – PheliX

+0

@ फेलीएक्स, हाँ, जिसने कुछ लीड दी, यह 'क्लास प्रोजेक्ट .कोरर्ग 1arg2' देता है, लेकिन uberjar' arg1arg2 देता है '... कुछ प्रगति की तरह दिखता है, लेकिन अभी तक काफी उपयोगी नहीं है। वह, या मुझे –

उत्तर

6

ऐसा लगता है कि यह एक बग के कारण होता है जो गिट में तय किया गया है। फिक्स 1.4.2 में होगा, जो कुछ दिनों में बाहर होना चाहिए। इस बीच, आप यहां चर्चा किए गए वर्कअराउंड का उपयोग कर सकते हैं: http://groups.google.com/group/clojure/msg/a8160b23a5019a12

+0

हाँ, यह काम करता है। चलाने के लिए मॉड्यूल निर्दिष्ट करने के लिए '-m' का उपयोग करके यह पूरी तरह से काम करता है। बहुत बहुत धन्यवाद। –

+0

एफडब्ल्यूआईडब्ल्यू फिक्स कुछ दिन पहले जारी किया गया था। – technomancy

6

lein-run से: "args के रूप में * कमांड लाइन-आर्ग * पर पारित हो जाएगा"

तो आप उन का उपयोग करना होगा। साइट पर उदाहरण दिखाता है कि कैसे। यदि अब आप जो तर्क दे रहे हैं, आप भी इसका उपयोग करते हैं: आपके प्रोजेक्ट.क्लोज़ में निर्दिष्ट करने के लिए रन-उपनाम। फिर, उल्लिखित साइट में सभी जानकारी है।

(ns addressbook.core 
    (:gen-class)) 

(defn -main [& [args]] 
    (if args (println args))) 

दोनों "lein रन पता पुस्तिका foo" के रूप में मेरे लिए "lein uberjar" काम:

मेरे नमूना

(defproject addressbook "1.0.0-SNAPSHOT" 
    :description "FIXME: write" 
    :main addressbook.core 
    :run-aliases {:addressbook [addressbook.core -main "arg1"]} 
    :dependencies [[org.clojure/clojure "1.2.0"] 
       [org.clojure/clojure-contrib "1.2.0"]] 
    :dev-dependencies [[lein-run "1.0.0"]]) 

और परीक्षण कोड project.clj।

+0

कुछ याद आ रहा है, अगर मैं '(: जेन-क्लास) 'और' args 'भागों को हटा देता हूं, और' * कमांड-लाइन-Args * 'प्रिंट करता हूं, तो मुझे' nil' नहीं मिल रहा है तर्क और तर्क के साथ एक जावा स्टैक ट्रेस। और जेन-क्लास के बिना, uberjar कभी काम नहीं करता –

+0

अजीब, मैंने अभी एक बहुत ही सरल प्रोजेक्ट बनाया है जो केवल * कमांड-लाइन-एर्ग * प्रिंट करता है, लेकिन मैं इसका उपयोग नहीं करता: जेन-क्लास और मुख्य नहीं है तरीका। क्या रन-एलियास के साथ समाधान आपके लिए काम करता है? –

+0

आपके पास मुख्य विधि नहीं है? तो आप leiningen का उपयोग नहीं कर रहे हैं? और नहीं, दो तर्कों के साथ एक रन-एलियास को परिभाषित करना और '* कमांड-लाइन-एर्ग * * प्रिंट करना अभी भी मुझे एक जावा स्टैक ट्रेस देता है .. –

संबंधित मुद्दे