从命令行(不使用lein)将clojure源编译为类(AOT)

时间:2015-03-12 13:37:21

标签: java clojure

我试图将clojure源代码编译成类文件,并仅使用命令行运行它,没有lein,也没有(可能)回复。

我在src/hello目录中有core.clj。

.
└── src
    └── hello
        └── core.clj

这是源代码。

(ns hello.core)
(defn -main
  "This should be pretty simple."
  []
  (println "Hello, World!"))

在REPL中使用(compile)

从这个网站的提示(http://clojure.org/compilation)中,我试图从REPL获取类文件。

我在src目录中使用lein repl启动了REPL,然后尝试编译以获取错误。

user=> (compile 'hello.core)

CompilerException java.io.IOException: No such file or directory, compiling:(hello/core.clj:1:1)  

命令行

从这篇文章simple tool for compiling Clojure .clj into .class / .jarHow to compile file in clojure来看,似乎我可以在REPL之外编译clojure源代码。

我在.尝试了此操作以获取错误。

> java -cp .:<PATH>/clojure-1.6.0.jar -Dclojure.compile.path=build clojure.lang.Compile src/hello/core.clj 
Compiling src/hello/core.clj to build
Exception in thread "main" java.io.FileNotFoundException: Could not locate 
hello/core/clj__init.class or hello/core/clj.clj on classpath: 
at clojure.lang.RT.load(RT.java:443)
at clojure.lang.RT.load(RT.java:411) 
...

所以,这是我的问题:

  • 如何编译clojure源以获取带/不带REPL的类?
  • 如何使用Java运行该类?执行java -cp .:CLOJURE_JAR main是否足够?

1 个答案:

答案 0 :(得分:2)

REPL

调用REPL时,应添加类路径。

java -cp .:<PATH>/clojure-1.6.0.jar:./src clojure.main

您需要将*compile-path*设置为(set! *compile-path* "build")

然后你可以编译来获取类文件。

user=> (compile 'hello.core)
hello.core

命令行

有两个问题:

  1. 对于编译,CP应包含源目录。
  2. 参数不是文件路径,而是命名空间。
  3. 这是调用编译器。

    clojure> java -cp .:<PATH>/clojure-1.6.0.jar:./src -Dclojure.compile.path=build clojure.lang.Compile hello.core
    Compiling hello.core to build
    

    执行类文件

    您应该指向类文件所在的目录。

    clojure> java -cp .:<PATH>/clojure-1.6.0.jar:./build hello.core
    Hello, World!
    

    参考