【问题标题】:Compile clojure source into class (AOT) from command line (not using lein)从命令行将 clojure 源代码编译为类(AOT)(不使用 lein)
【发布时间】:2015-05-14 16:46:52
【问题描述】:

我正在尝试将 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够吗?

【问题讨论】:

  • 那么 gradle 在哪里加入呢?
  • @cfrick:我更新了标题。

标签: java clojure


【解决方案1】:

REPL

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

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

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

然后就可以编译得到class文件了。

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!

参考文献

【讨论】:

    猜你喜欢
    • 2016-02-01
    • 2017-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-14
    • 1970-01-01
    • 2017-07-14
    • 2012-03-15
    相关资源
    最近更新 更多