Leiningen(Clojure)のAOTコンピレーションを最小限に抑えるにはどうすればよいですか
質問
Leiningenを使用してClojureプロジェクトを作成すると、すべての *.clj-FilesがAOTがコンパイルされます。通常、AOTコンピレーションは必要ありません。最小限に抑えたいと思います。
これは、Javaが支配する環境の補完としてClojureを受け入れるために必要です。 1つのクラスファイルを接着剤として「販売」する方が簡単です。いくつかの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 to:
(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を変更することもできます(注:in クラス/ダミー!)そしてもちろん、変更を再コンパイルする必要はありません。
今、私の質問はこれに要約されています: このCore.classだけを取得する簡単な方法はありますか?
解決
Leiningenは、デフォルトでかなり長い間AOTを実行していません。おそらくあなたは古いバージョンを持っていますか?しかし、JARの作成の前に推移的なAOTが削除されるために作成された。クラスファイルを保証する新しい機能(1.4.0-Snapshot)があります(Clojure Assembla#322を参照)。