2010-12-30 38 views
13

Gần đây tôi đã bắt đầu với clojure và tôi đang sử dụng leiningen để tạo một dự án nhỏ. Tôi đang gặp khó khăn trong việc nhận được leiningen để hành xử với các đối số dòng lệnh. Sau đây là tôi src/project/core.cljđối số dòng lệnh với leiningen

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

của tôi Bây giờ khi tôi chạy lein run arg1 arg2, nó mang lại cho tôi lỗi này:

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 

Tuy nhiên, nếu tôi làm một lein uberjar và sau đó làm java -jar project-1.0.0-SNAPSHOT-standalone.jar arg1 arg2, tôi nhận được kết quả chính xác.

arg1arg2 

Thật không thoải mái khi phải tạo uberjar để chạy nó mỗi khi phát triển, có cách nào tốt hơn không?

+0

thử chạy lein project.core arg1 arg2 – PheliX

+0

@PheliX, yep, đã đưa ra một số khách hàng tiềm năng, nó cung cấp 'class project.corearg1arg2', nhưng uberjar cho' arg1arg2 '... trông giống như một số tiến bộ, nhưng không hoàn toàn có thể sử dụng được. Điều đó, hoặc tôi thiếu một cái gì đó –

Trả lời

6

Điều này có vẻ như do lỗi được sửa trong git. Bản sửa lỗi sẽ ở dạng 1.4.2, sẽ được khắc phục trong vài ngày tới. Trong thời gian đó, bạn có thể sử dụng các giải pháp được thảo luận tại đây: http://groups.google.com/group/clojure/msg/a8160b23a5019a12

+0

Đúng, nó hoạt động. bằng cách sử dụng '-m' để chỉ định mô-đun để chạy làm cho nó hoạt động hoàn hảo. Cảm ơn rất nhiều. –

+0

FWIW bản sửa lỗi đã được phát hành cách đây vài ngày. – technomancy

6

Từ lein-run: "args sẽ được chuyển về dưới dạng * dòng lệnh-args *"

Vì vậy, bạn sẽ phải sử dụng những. Ví dụ trên trang web hiển thị như thế nào. Nếu bạn bây giờ những gì các đối số bạn đang đi qua bạn cũng sử dụng: chạy-bí danh để xác định những người trong project.clj của bạn. Một lần nữa, trang web đã đề cập có tất cả thông tin.

mẫu của tôi 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"]]) 

Và mã kiểm tra:

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

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

Cả hai "Lein chạy addressbook foo" như "Lein uberjar" công việc cho tôi.

+0

Không, nếu tôi loại bỏ '(: gen-class)' và '& args' phần, và in' * command-line-args * ', tôi nhận được' nil' không có đối số và dấu vết ngăn xếp java với đối số. Và không có lớp gen, uberjar không bao giờ hoạt động –

+0

Thật lạ lùng, tôi vừa tạo ra một dự án rất đơn giản chỉ in * command-line-args *, nhưng tôi không sử dụng: gen-class và không có chính phương pháp. Giải pháp với bí danh chạy có hiệu quả với bạn không? –

+0

Bạn không có phương pháp chính? vì vậy bạn không sử dụng leiningen? và không, xác định một bí danh chạy với hai đối số và chỉ in lệnh '* command-line-args *' vẫn cho tôi một dấu vết ngăn xếp java .. –

Các vấn đề liên quan