2010-12-30 7 views
13

最近私はclojureを使い始めました。私は小さなプロジェクトを作成するためにleiningenを使用しています。私はコマンドライン引数で動作するようにleiningenを取得する際に問題を抱えています。以下は私のsrc/project/core.cljleiningenのコマンドライン引数

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

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

であると私はlein run arg1 arg2を実行したときに、私の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"]]) 

は今、それは私に、このエラーを与える:しかし

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を作成する必要はありませんが、より良い方法はありますか? lein-runから

+0

私はいくつかの鉛を与えた、それは 'class project.corearg1arg2'を与える@PheliX、うん、project.core arg1 arg2 – PheliX

+0

を実行しようとするが、uberjarは' arg1arg2 '...いくつかの進歩のように見えますが、それでも十分に利用可能ではありません。それは、または何かが欠けている –

答えて

6

これはgitで修正されたバグが原因です。修正は1.4.2にあり、数日後に修正されるはずです。ここで議論する回避策を使用することができます:http://groups.google.com/group/clojure/msg/a8160b23a5019a12

+0

うん、それはうまくいく。実行するモジュールを指定するために '-m'を使用すると、完全に動作します。どうもありがとう。 –

+0

FWIW修正プログラムは数日前にリリースされました。 – technomancy

6

:だから、あなたがそれらを使用する必要があります

を「argsが* *コマンドライン引数として渡されます」。サイト上の例は、どのように表示されます。あなたが今あなたに渡している引数があれば:run-aliasesを使用してproject.clj内のものを指定してください。再度、上記のサイトはすべての情報を持っています。

マイサンプル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"]]) 

とテストコード:

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

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

"レインuberjar" 作品として両方とも "レインの実行アドレス帳foo" という私のために。

+0

'(:gen-class)'と '&args'部分を削除し、' * command-line-args * 'を表示すると、' 'nil''をno引数と引数付きのJavaスタックトレース。そして、gen-classがなければ、uberjarはうまくいきません。 –

+0

奇妙なことに、私はちょうど* command-line-args *を出力する非常に単純なプロジェクトを作成しましたが、私は使用しません。gen-classとmain方法。実行エイリアスを持つソリューションはあなたのために機能しますか? –

+0

メインメソッドはありませんか?あなたはライニングを使用していませんか? 2つの引数を指定して実行エイリアスを定義し、 '* command-line-args * 'を表示するだけで、Javaスタックトレースが得られます。 –

関連する問題