2010-12-30 26 views
13

Ho recentemente iniziato con clojure e sto utilizzando leiningen per creare un piccolo progetto. Sto avendo problemi nel far sì che leiningen si comporti con gli argomenti della riga di comando. Quanto segue è la mia src/project/core.cljargomenti della riga di comando con leiningen

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

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

e la mia 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"]]) 

Ora, quando corro lein run arg1 arg2, mi dà questo errore:

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 

Tuttavia, se faccio un lein uberjar e poi do java -jar project-1.0.0-SNAPSHOT-standalone.jar arg1 arg2, ottengo l'output corretto.

arg1arg2 

Non è molto comodo avere per creare l'uberjar per eseguirlo ogni volta mentre lo sviluppo, c'è un modo migliore?

+0

provare Lein arg1 corsa project.core arg2 – PheliX

+0

@PheliX, sì, che ha dato un po 'di piombo, dà classe 'project.corearg1arg2', ma l'uberjar dà' arg1arg2 "... sembra un progresso, ma non abbastanza utilizzabile ancora. Quello, o mi manca qualcosa –

risposta

6

Questo sembra essere causato da un bug che è stato corretto in git. La correzione sarà in 1.4.2, che dovrebbe essere disponibile tra qualche giorno. Nel frattempo, è possibile utilizzare soluzioni alternative discusse qui: http://groups.google.com/group/clojure/msg/a8160b23a5019a12

+0

Sì, funziona. usando '-m' per specificare il modulo da eseguire lo fa funzionare perfettamente. Molte grazie. –

+0

FWIW la correzione è stata rilasciata pochi giorni fa. – technomancy

6

Da lein-run: "sarà trasmesso Args come * della riga di comando-args *"

quindi dovrete usare quelli. L'esempio sul sito mostra come. Se ora gli argomenti che stai passando ti servono anche: run-alias per specificare quelli nel tuo project.clj. Di nuovo, il sito menzionato ha tutte le informazioni.

mio campione project.clj

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

E il codice di prova:

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

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

Sia "run lein rubrica foo" come lavoro "Lein uberjar" per me.

+0

No, se rimuovo '(: gen-class)' e le parti '& args' e stampo' * command-line-args * ', sto ottenendo' nil' senza argomenti e una traccia java stack con argomenti. E senza la gen-class, l'uberjar non funziona mai –

+0

Strano, ho appena creato un progetto molto semplice che stampa solo * command-line-args *, ma non lo uso: gen-class e non ho un main metodo. La soluzione con gli alias di run funziona per te? –

+0

Non hai un metodo principale? quindi non stai usando leiningen? e no, definendo un run-alias con due argomenti e semplicemente stampando '* command-line-args *' mi dà ancora una traccia java stack .. –

Problemi correlati