2010-12-30 30 views
13

Kısa bir süre önce clojure ile başladım ve küçük bir proje oluşturmak için leiningen kullanıyorum. Komut satırı argümanlarıyla davranmak için leiningen almakta sıkıntı yaşıyorum. şudur benim src/project/core.cljleiningen ile komut satırı argümanları

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

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

ve benim 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"]]) 
Şimdi

Ben lein run arg1 arg2 çalıştırdığınızda, bana bu hata veriyor: Sonra bir lein uberjar ve bunu yaparsanız, ancak

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 

java -jar project-1.0.0-SNAPSHOT-standalone.jar arg1 arg2 yap, doğru çıktıyı aldım.

arg1arg2 

Bu gelişme, daha iyi bir yolu varken bunu her zaman çalıştırmak için uberjar oluşturmak zorunda kalmak çok rahat değil? lein-run itibaren

+0

evet, – PheliX

+0

@PheliX arg2 Lein çalışma project.core ARG1 deneyin: Bu süre içinde, burada tartışılan geçici çözümleri kullanabilirsiniz '... bazı ilerlemeler gibi görünüyor, ama henüz oldukça kullanışlı değil. Bu, ya da ben bir şey eksik –

cevap

6

Bu, git'te giderilen bir hatanın neden olduğu gibi görünüyor. Düzeltme, birkaç gün içinde olması gereken 1.4.2'de olacak. Bazı kurşun verdi, bu `verir sınıf project.corearg1arg2` ama uberjar` arg1arg2 verir http://groups.google.com/group/clojure/msg/a8160b23a5019a12

+0

Evet, işe yarıyor. Çalıştırılacak modülü belirtmek için '-m 'kullanılması onu mükemmel şekilde çalıştırır. Çok teşekkürler. –

+0

FWIW, düzeltme birkaç gün önce yayınlandı. – technomancy

6

: "Args * komut satırı-args * olarak geçirilir"

Yani o kullanmak zorunda olacak. Sitede örnek nasıl olduğunu gösterir. Eğer şimdi size hangi argümanları iletirseniz, şunu da kullanabilirsiniz: run-aliases project.clj. Yine, söz konusu site tüm bilgilere sahiptir.

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

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

Hem "Lein çalıştırmak addressbook foo" benim için "Lein uberjar" eseri olarak:

Benim örnek

(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"]]) 

Ve test kodu project.clj.

+0

Hayır, eğer ben (: gen-class) 've' & args' parçaları kaldırmak ve '' komut satırı-args * 'yazdı, ben' nil 'hayır ile alıyorum argümanlar ve argümanlar ile bir java yığın izi. Ve gen sınıfı olmadan, uberjar hiçbir zaman –

+0

Weird çalışır, sadece sadece * komut satırı-args * yazdırır çok basit bir proje oluşturdu, ama kullanmıyorum: gen sınıfı ve bir ana yok yöntem. Run-aliases ile çözüm sizin için çalışıyor mu? –

+0

Ana yönteminiz yok mu? Yani leiningen kullanmıyor musunuz? ve hayır, iki argümanla run-alias tanımlamak ve sadece '* komut satırı-args *' yazdırmak bana hala bir java yığın izini verir .. –

İlgili konular