如何最小化leiningen中的AOT编译(Clojure)

时间:2010-10-31 09:54:49

标签: clojure leiningen aot

使用leiningen创建Clojure项目时,所有* .clj文件都是AOT编译的。通常情况下,AOT编译不是必需的,我想尽量减少它。

这对我来说是必要的,要求接受Clojure作为Java主导环境中的补充。将单个类文件作为粘合剂与几个kB clj文件一起“出售”更容易,而不是具有250+ kB类文件的替代方案,这些类文件具有奇怪的名称,并且在它们之间隐藏了一个小的clj文件(这不是在执行期间甚至不再阅读。

理想情况下,“lein compile”的结果只是一个小类文件(与clj-files和clojure-library一起)实现所需的类实例。

实现这一目标的最简单方法是什么?我宁愿不写一行Java(当然)。

技术反馈后的更新

我不怀疑这是莱宁根问题。让我用一个例子来解释我的意思。请原谅示例的长度。我正在使用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?

1 个答案:

答案 0 :(得分:4)

Leiningen默认情况下没有做过AOT很长一段时间了;也许你有一个旧版本?但是有一个新功能(在1.4.0-SNAPSHOT中)确保由于传递AOT而创建的.class文件在创建jar之前被删除(参见Clojure集合#322),这可能也会让你感兴趣。