2010-10-31 40 views
2

当您使用leiningen创建Clojure项目时,所有* .clj文件都被编译为AOT。通常情况下,AOT编译不是必需的,我想将其最小化。如何最小化Leiningen中的AOT编译(Clojure)

这对于我提高Clojure接受度作为Java主导环境的补充是必要的。将一个单独的类文件作为粘合剂与一些kB的clj文件一起“卖”出来,这样更容易将250 kB以上的类文件替换为奇怪的名称,并在它们之间隐藏一个小小的clj文件在执行期间甚至不会再读取)。

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

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

反馈后

更新我不怀疑这是一个leiningen问题。让我通过一个例子来解释我的后果。请原谅这个例子的长度。我正在使用leiningen 1.3.1,但我认为1.4.0-SNAPSHOOT的行为方式相同。

$ lein new dummy 
Created new project in: dummy 
$ cd dummy 

现在改变project.clj至(加入 “:主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 /虚设/ core.clj到:

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

现在编译它:

$ lein compile 
Compiling dummy.core 

这将生成以下文件在类/虚拟

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到类/虚拟现在看起来很空:

$ 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(注:在类/ dummy!),当然,变化不需要重新编译。

现在我的问题归结为:有没有更简单的方法来得到这个core.class?

回答

4

Leiningen目前在默认情况下没有进行AOT操作;也许你有一个旧版本?但是有一个新特性(在1.4.0-SNAPSHOT中)可以确保由于传输AOT而创建的.class文件在创建jar之前被删除(请参阅Clojure丛集#322),这也可能会引起您的兴趣。

+0

我正在使用1.3.1。当然,leiningen不应该怪罪。然而,当我做“lein new dummy”时,用一些“defn”填充dummy/core.clj并向project.clj添加一个“:main dummy.core”,然后“lein compile”生成大量类文件。再次,这可能是正确的(lein从不错!),但我想知道如何防止这种情况。 – jramb 2010-10-31 15:52:21

+0

是的,你被Clojure bug#322咬了:https://www.assembla.com/spaces/clojure/tickets/322-enhance-aot-compilation-process-to-emit-classfiles-only-for-明确指定的命名空间Leiningen 1.4将包含解决此问题的解决方法。它应该在一周左右发布;如果你更快需要它,你可以从git运行。 – technomancy 2010-10-31 16:58:04

+0

感谢您的反馈,技术!我期待新版本。上面我试图更详细地解释我希望完成的事情。尽管我明白错误#322与我的问题的关系,我希望我的解决起来更容易。 :-) – jramb 2010-10-31 17:46:00