从命令行(不使用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
命令行
有两个问题:
- 对于编译,CP应包括源目录。
- 该参数不是文件路径,而是命名空间。
这是为了调用编译器。
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!
参考
- 编译Clojure?
- http://clojure.org/compilation