代码之家  ›  专栏  ›  技术社区  ›  prosseek

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

  •  3
  • prosseek  · 技术社区  · 10 年前

    我正在尝试将clojure源代码编译到类文件中,并仅使用命令行运行它,不使用lein,也不使用(可能)回复。

    我有core.clj src/hello 目录

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

    这是源代码。

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

    使用 (compile) 在REPL中。

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

    我开始REPL时 lein repl 在src目录中,然后尝试编译以获得错误。

    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 / .jar How 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 回复  |  直到 10 年前
        1
  •  3
  •   Community CDub    7 年前

    回复

    调用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. 参数不是文件路径,而是命名空间。

    这是为了调用编译器。

    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!
    

    工具书类