Clojure 带有leiningen的命令行参数

Clojure 带有leiningen的命令行参数,clojure,command-line-arguments,leiningen,Clojure,Command Line Arguments,Leiningen,我最近开始与clojure合作,我正在使用leiningen创建一个小项目。我在让leiningen使用命令行参数时遇到了麻烦。下面是我的src/project/core.clj (ns project.core (:gen-class)) (defn -main [& args] (println (apply str args))) (defproject project "1.0.0-SNAPSHOT" :description "FIXME: write"

我最近开始与clojure合作,我正在使用leiningen创建一个小项目。我在让leiningen使用命令行参数时遇到了麻烦。下面是我的
src/project/core.clj

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

(defn -main [& args]
    (println (apply str args)))
(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"]])
还有我的
project.clj

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

(defn -main [& args]
    (println (apply str args)))
(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"]])
现在,当我运行
lein run arg1 arg2
时,会出现以下错误:

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
但是,如果我先执行
leinuberjar
,然后执行
java-jarproject-1.0.0-SNAPSHOT-standalone.jar arg1 arg2
,我会得到正确的输出

arg1arg2
每次开发时都要创建uberjar来运行它,这不是很舒服,有没有更好的方法?

From:“Args将作为*命令行Args*传递”

所以你必须使用这些。该站点上的示例演示了如何使用。如果您现在知道要传递的参数,还可以使用:run别名指定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)))

“lein run addressbook foo”和“lein uberjar”对我来说都很有用。

这似乎是由git中修复的一个bug引起的。修复程序将出现在1.4.2中,它将在几天后发布。同时,您可以使用这里讨论的解决方法:

不,如果我删除
(:gen class)
&args
部分,并打印
*命令行args*
,我将得到不带参数的
nil
,以及带参数的java堆栈跟踪。没有gen类,uberjar永远不会工作,我只是创建了一个非常简单的项目,只打印命令行参数,但我没有使用:gen类,也没有main方法。带有运行别名的解决方案对您有效吗?您没有main方法吗?所以你没有用莱宁根?不,用两个参数定义一个运行别名,然后只打印
*命令行args*
仍然可以得到java堆栈跟踪。您可以使用leiningen,而不需要main方法。但我在回答中添加了一些示例代码(带有:gen类和一个main方法)。希望这能说明问题。等等,我必须添加
lein run
作为开发人员依赖项?但是我已经有了一个lein run,它不同吗?试试lein run project.core arg1arg2@PheliX是的,这提供了一些线索,它提供了
类项目。corearg1arg2
,但uberjar提供了
arg1arg2
。。。看起来有些进步,但还不太实用。或者我错过了什么是的,这是可行的。使用
-m
指定要运行的模块可以使其完美工作。非常感谢。FWIW修复程序是在几天前发布的。