我如何在Leiningen(Clojure)中最小化AOT编译

How can i minimize the AOT compilation in leiningen (Clojure)

当您使用leiningen创建Clojure项目时,所有* .clj文件都将被AOT编译。通常,不需要AOT编译,我希望将其最小化。

对于我来说,提高Clojure作为Java主导环境中的补充的接受度是必要的。将单个类文件作为胶水与几个kB clj文件一起"出售"会比较容易,而不是使用250个以上带有奇怪名称的kB类文件并在其中隐藏一个小clj文件(这不是在执行过程中甚至再也读不到)。

理想情况下," lein编译"的结果将只是一个小的类文件(与clj文件和clojure库一起)实现所需的类实例。

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

在获得技术反馈后进行更新

我不认为这是一个列宁根问题。让我用一个例子解释我的追求。请原谅示例的长度。我正在使用leiningen 1.3.1,但我认为1.4.0-SNAPSHOOT的行为方式相同。

1
2
3
$ lein new dummy
Created new project in: dummy
$ cd dummy

现在将project.clj更改为(添加了":main dummy.core"):

1
2
3
4
5
(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到:

1
2
3
4
(ns dummy.core
  (:gen-class))
(defn -main [& args]
  (println"This is Clojure code, args=" args))

现在编译它:

1
2
$ lein compile
Compiling dummy.core

这将在class / dummy中生成以下文件:

1
2
3
4
core.class
core__init.class
core$loading__4410__auto__.class
core$_main.class

都是正确的,我可以执行结果:

1
2
$ java -cp lib/*:classes dummy.core Hello
This is Clojure code, args= (Hello)

现在出现了我想拥有的东西,但是我手动进行:
我可以删除除core.class之外的所有类文件,并将core.clj复制到现在看起来很空的classes / dummy中:

1
2
3
$ ls classes/dummy/
core.class
core.clj

core.class包含在运行时加载core.clj的代码,结果仍然相同,我仍然可以这样做:

1
2
$ java -cp lib/*:classes dummy.core Hello
This is Clojure code, args= (Hello)

我还可以修改core.clj(注意:在类/虚拟对象中!),当然,不需要重新编译更改。

现在,我的问题可以归结为:是否有一种更简单的方法来获取此core.class?


莱宁根(Leiningen)在相当长的时间内默认未进行AOT; 也许您有旧版本? 但是有一个新功能(在1.4.0-SNAPSHOT中)可以确保在创建jar之前删除由于传递AOT而创建的.class文件(请参阅Clojure assembla#322),这也会引起您的兴趣。