2010-12-30 28 views
13

Recientemente comencé con clojure, y estoy usando leiningen para crear un proyecto pequeño. Estoy teniendo problemas para que leiningen se comporte con argumentos de línea de comando. La siguiente es mi src/project/core.cljargumentos de línea de comando con leiningen

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

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

y mi 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"]]) 

Ahora en que funciono lein run arg1 arg2, me da este error:

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 

Sin embargo, si hago un lein uberjar y luego do java -jar project-1.0.0-SNAPSHOT-standalone.jar arg1 arg2, obtengo la salida correcta.

arg1arg2 

No es muy cómodo tener que crear el uberjar para ejecutarlo cada vez que si bien el desarrollo, hay una manera mejor?

+0

tratar Lein arg1 arg2 plazo project.core – PheliX

+0

@PheliX, sí, que le dio un poco de plomo, da 'project.corearg1arg2' clase, pero el uberjar da' arg1arg2 '... parece un progreso, pero todavía no se puede usar. Eso, o me falta algo –

Respuesta

6

Parece que se debe a un error que se ha solucionado en git. La solución estará en 1.4.2, que debería estar disponible en unos días. Por el momento, puede utilizar soluciones discutidas aquí: http://groups.google.com/group/clojure/msg/a8160b23a5019a12

+0

Sí, eso funciona. usar '-m' para especificar el módulo a ejecutar lo hace funcionar perfectamente. Muchas gracias. –

+0

FWIW la solución fue lanzada hace unos días. – technomancy

6

De lein-run: "Args será pasado como * command-line-args *"

por lo que tendrá que usar esos. El ejemplo en el sitio muestra cómo. Si ahora qué argumentos le está pasando, también use: ejecutar alias para especificarlos en su proyecto.clj. Una vez más, el sitio mencionado tiene toda la información.

Mi muestra 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"]]) 

Y el código de prueba:

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

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

Tanto "Lein plazo de direcciones foo" como trabajo "Lein uberjar" para mí.

+0

No, si elimino las partes '(: gen-class)' y '& args', e imprimo' * command-line-args * ', obtengo' nil' sin argumentos y un rastro de pila java con argumentos. Y sin gen-class, el uberjar nunca funciona –

+0

Weird, acabo de crear un proyecto muy simple que solo imprime * command-line-args *, pero no uso: gen-class y no tengo un main método. ¿Funciona la solución con los alias de ejecución para usted? –

+0

¿No tienes un método principal? ¿entonces no estás usando leiningen? y no, la definición de un alias de ejecución con dos argumentos y el solo hecho de imprimir '* command-line-args *' aún me da un rastro de la pila Java. –

Cuestiones relacionadas