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