我有一个名为mr1的clojure应用程序; 它的project.clj位于./mr1/中,而mr1.clj位于./mr1/src中。

我无法弄清楚如何正确构造目录,名称空间和project.clj文件,因此可以使用Cake Bin构建二进制文件。

附上我当前的project.clj和mr1.clj的头部和尾部。

src / mr1.clj可以很好地加载到cake repl中并执行。 cake bin生成一个不包含-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))


    )
)

===============>>#1 票数:1 已采纳

正如我在回答第一个问题时提到的那样,您必须启用名称空间的AOT编译。 如果有人遇到相同的问题,我已在此处复制了该答案。

正如sample.project.clj文件所说, :main键应该有一个包含-main函数的命名空间作为分配值。 所以你应该有这样的功能

(defn -main [& args]
  (do-things-you-want-to-do-on-program-start))

在您的mr1.clj中。 同样,如果要将程序用作独立的jar,则必须具有gen-classed这个名称空间。 我的意思是您必须:

  1. 在名称空间定义中包含:gen-class选项,如下所示:

     (ns mr1 (:gen-class) ...other options...) 
  2. 使名称空间经过AOT编译(AOT代表Ahead of Time)。 为此,您需要在project.clj的AOT编译的名称空间列表中指定名称空间:

     (defproject mr1 "0.0.1-SNAPSHOT" ...other definitions... :aot [mr1] :main mr1) 

完成此操作后,您可以使用cake为您生成可执行的jar。

  ask by octopusgrabbus translate from so

未解决问题?本站智能推荐: