当您使用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?
我正在使用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
是的,你被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
感谢您的反馈,技术!我期待新版本。上面我试图更详细地解释我希望完成的事情。尽管我明白错误#322与我的问题的关系,我希望我的解决起来更容易。 :-) – jramb 2010-10-31 17:46:00