当您使用 leiningen 创建 Clojure 项目时,所有 *.clj 文件都被编译为 AOT。通常不需要 AOT 编译,我想尽量减少它。
这对于我提高对 Clojure 作为 Java 主导环境中的补充的接受度是必要的。将单个类文件作为胶水与几个 kB clj 文件一起“出售”更容易,而不是拥有 250+ kB 类文件,名称奇怪并隐藏在其中一个小 clj 文件(这是'甚至在执行期间不再阅读)。
理想情况下,“lein compile”的结果将只有一个小类文件(连同 clj-files 和 clojure-library)实现所需的类实例。
实现这一目标的最简单方法是什么?我宁愿不写一行Java(当然)。
技术人员反馈后更新
我不怀疑这是一个 leiningen 问题。让我用一个例子来解释我所追求的。请原谅示例的长度。我正在使用 leiningen 1.3.1,但我认为 1.4.0-SNAPSHOOT 的行为方式相同。
$ lein new dummy
Created new project in: dummy
$ cd dummy
现在将 project.clj 更改为(添加“:main dummy.core”):
(defproject dummy "1.0.0-SNAPSHOT"
:description "FIXME: write"
:dependencies [[org.clojure/clojure "1.2.0"]
[org.clojure/clojure-contrib "1.2.0"]]
:main dummy.core)
和 src/dummy/core.clj 到:
(ns dummy.core
(:gen-class))
(defn -main [& args]
(println "This is Clojure code, args=" args))
现在编译它:
$ lein compile
Compiling dummy.core
这会在classes/dummy中生成以下文件:
core.class
core__init.class
core$loading__4410__auto__.class
core$_main.class
这都是正确的,我可以执行结果:
$ java -cp lib/*:classes dummy.core Hello
This is Clojure code, args= (Hello)
现在是我想要的,但我手动执行:我可以删除除core.class之外的所有类文件,并将core.clj复制到现在看起来很空的classes/dummy中:
$ ls classes/dummy/
core.class
core.clj
core.class 包含在运行时加载 core.clj 的代码,结果仍然是一样的,我仍然可以这样做:
$ java -cp lib/*:classes dummy.core Hello
This is Clojure code, args= (Hello)
我还可以修改 core.clj(注意:在classes/dummy中!),当然不需要重新编译更改。
现在我的问题归结为:有没有更简单的方法来获取这个 core.class?