2011-12-11 83 views
0

我有一个叫做mr1的clojure应用程序;它的project.clj位于./mr1/中,而mr1.clj位于./mr1/src中。构建Clojure蛋糕搭建环境

我无法弄清楚如何正确构造目录,名称空间和project.clj文件,所以我可以使用蛋糕箱来构建二进制文件。

封闭的是我当前的project.clj和mr1.clj的头部和尾部。

src/mr1.clj加载到cake repl中并执行。蛋糕箱产生一个包含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)) 


    ) 
) 

回答

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-classed。我的意思是,你必须:

  1. 包括像这样在您的命名空间定义:gen-class选项:

    (ns mr1 
        (:gen-class) 
        ...other options...) 
    
  2. 使命名空间AOT编译(AOT代表提前)。要做到这一点,你需要指定project.clj在AOT编译命名空间的列表中选择您的命名空间:

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

你这样做后,您可以使用cake生成可执行的JAR你。

+0

我很抱歉发生碰撞,并感谢您回答这个问题。 – octopusgrabbus