leiningen を使用して Clojure プロジェクトを作成すると、すべての *.clj ファイルが AOT でコンパイルされます。通常、AOT コンパイルは必要ないため、最小限に抑えたいと考えています。
これは、Java が支配する環境で Clojure を補完するものとして受け入れてもらうために必要なことです。奇妙な名前の 250 kB 以上のクラス ファイルを持ち、それらの中に小さな clj ファイルを隠すという代替案に対して、単一のクラス ファイルをいくつかの kB の clj ファイルと一緒に接着剤として「販売」する方が簡単です (これは実行中にそれ以上読み取らないでください)。
理想的には、「lein compile」の結果は、(clj ファイルと clojure ライブラリと共に) 必要なクラス インスタンスを実装する単一の小さなクラス ファイルになります。
これを達成する最も簡単な方法は何ですか?もちろん、Java を 1 行も書きたくありません (もちろん)。
テクノマンシーからのフィードバック後の更新
これがライニンゲンの問題だとは思いません。例を挙げて、私が何を求めているかを説明しましょう。例の長さをお許しください。私は 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 を変更することもできます (注:クラス/ダミー内で!)。もちろん、変更を再コンパイルする必要はありません。
私の質問はこれに要約されます:このcore.classだけを取得する簡単な方法はありますか?