2

当您使用 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?

4

1 回答 1

4

Leiningen 已经默认不做 AOT 已经有一段时间了。也许你有一个旧版本?但是有一个新功能(在 1.4.0-SNAPSHOT 中)可以确保在创建 jar 之前删除由于传递 AOT 而创建的 .class 文件(参见 Clojure assembla #322),您可能也会感兴趣。

于 2010-10-31T14:09:11.303 回答