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

我正在尝试将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) 

命令行

从这个简单的工具,用于将Clojure .clj编译成.class / .jar以及如何在clojure中编译文件 ,似乎我可以在REPL之外编译clojure源代码。

我试过这个. 得到一个错误。

 > java -cp .:/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

REPL

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

 java -cp .:/clojure-1.6.0.jar:./src clojure.main 

您需要使用(set! *compile-path* "build")

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

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

命令行

有两个问题:

  1. 对于编译,CP应包括源目录。
  2. 该参数不是文件路径,而是命名空间。

这是为了调用编译器。

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

执行类文件

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

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

参考