我有一个名为mr1的clojure应用程序;它的project.clj位于./mr1/,mr1.clj位于./mr1/src。
我无法弄清楚如何正确构造目录,命名空间和project.clj文件,因此我可以使用cake bin构建二进制文件。
附上我目前的project.clj和mr1.clj的头尾。
src / mr1.clj加载到cake repl并执行。 cake bin生成一个包含no -main的mr1文件。
(defproject mr1 "0.0.1-SNAPSHOT"
:description "TODO: add summary of your project"
:dependencies [[org.clojure/clojure "1.3.0"]
[org.clojure/tools.cli "0.1.0"]]
:main mr1)
(ns mr1
(:use [clojure.string :only [split]]
[clojure.string :only [join]]))
。 。
(defn -main
[& args]
(do
(reset! grid-dim (prompt-for-grid-dim))
(reset! mr1-pos (prompt-for-rover-pos 1))
(let [moves (prompt-for-rover-moves)]
(execute-each-move moves @mr1-pos))
(reset! mr2-pos (prompt-for-rover-pos 2))
(let [moves (prompt-for-rover-moves)]
(execute-each-move moves @mr2-pos))
)
)
答案 0 :(得分:1)
正如我在回答您的first question时提到的那样,您必须启用命名空间的AOT编译。我已经复制了这个答案,以防有人遇到同样的问题。
正如sample.project.clj文件所说,:main
密钥应该具有包含-main
函数的命名空间作为指定值。所以你应该有这样的功能
(defn -main [& args]
(do-things-you-want-to-do-on-program-start))
你的mr1.clj中的。还有AFAIR如果你想把你的程序用作一个独立的jar,你必须将这个命名空间归类。我的意思是你必须:
在命名空间定义中包含:gen-class
选项,如下所示:
(ns mr1
(:gen-class)
...other options...)
使命名空间AOT编译(AOT代表Ahead Of Time)。为此,您需要在project.clj中的AOT编译的命名空间列表中指定您的命名空间:
(defproject mr1 "0.0.1-SNAPSHOT"
...other definitions...
:aot [mr1]
:main mr1)
完成此操作后,您可以使用cake
为您生成可执行jar。