2010-06-26 67 views
16

我在这里感觉有点傻,但我不能让Clojure Hello World编译。编译Clojure?

目录结构:

hello-world/ 
    clojure-1.1.0.jar 
    build/ 
    classes/ 
    src/ 
    test/ 
     hello.clj 

hello.clj:

(ns test.hello 
    (:gen-class)) 

(defn -main [& args] 
    (println "Hello" (nth args 0))) 

互动:

$ cd hello-world 
[hello-world]$ java -cp ./clojure-1.1.0.jar:./build/classes:./src clojure.main 
Clojure 1.1.0 
user=> (require 'test.hello) 
nil 
user=> (test.hello/-main "there") 
Hello there 
nil 
user=> (compile 'test.hello) 
java.io.IOException: No such file or directory (hello.clj:2) 
user=> *compile-path* 
"classes" 
user=> (doseq [p (.split (System/getProperty "java.class.path") ":")] (println p)) 
./clojure-1.1.0.jar 
./build/classes 
./src 
nil 

所以我可以加载并调用来自REPL文件,但它不”编译。

clojure.org,编译需要

  • 命名空间必须classpath中相对文件路径匹配 - 检查
  • *编译路径*必须在类路径 - 检查
  • :创一流的参数ns的形式 - 检查

我发现this post from a year back,据我可以告诉我做的完全一样,但它不起作用。

我错过了什么?

系统:OS X 10.6,Java的1.6.0,Clojure的1.1

+0

看起来我不能接受我自己的答案,所以我必须离开问题,直到有人打开。 – 2010-06-26 11:29:43

+0

这也是相关的注意到,你很少需要AOT编译Clojure代码。 Clojure代码在没有被编译的情况下运行得很好,这就是你应该运行它的方式。 一些特定的Clojure Java互操作特性实际上*要求*您的代码是AOT编译的,但是如果您没有使用这些特性,请不要麻烦编译您的代码。 如果你想要一个可执行的jar文件,你可以只用Amain函数编译一个主文件来运行应用程序。但是,http://www.assembla.com/spaces/clojure/tickets/315-add-support-for-running--main-namespace-from-clojure-main-without-aot – Rayne 2010-07-06 12:32:40

回答

11

为什么你不使用Leiningen?使用它比手动编译代码容易得多。你可以使用my article作为介绍...

+0

我已经简单地使用它来下载外部项目的依赖关系,但到目前为止还没有研究如何将它用作构建工具。感谢您的链接,我会检查出来。 – 2010-06-27 11:02:05

+0

很好的概述,谢谢你的文章。可能是关于时间我反正开始使用构建工具:) – 2010-06-27 19:27:10

+0

Leiningen不帮我:$ lein test 找不到project.clj,这是测试所需的 – mcandre 2011-03-07 21:00:32

20

得到它,还有一个第四个要求:

  • *编译路径*的工作目录相对的JVM解决,通常Java启动的目录。或者REPL:(System/getProperty "user.dir")

所以此工程:

user=> (set! *compile-path* "build/classes")  
"build/classes" 
user=> (compile 'test.hello) 
test.hello 
+0

修改了解释,第一个错了。修正是相同的。 – 2010-06-26 18:31:05

+4

对我来说,(set!* compile-path *“。”)是编译当前目录中的CLJ所必需的。 – mcandre 2011-03-07 00:59:56

+0

+1这帮了我......谢谢! – OscarRyz 2011-06-01 21:48:37