2

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だけを取得する簡単な方法はありますか?

4

1 に答える 1

4

Leiningen は、かなり長い間、デフォルトで AOT を実行していません。おそらくあなたは古いバージョンを持っていますか?しかし、(1.4.0-SNAPSHOT には) 推移的な AOT によって作成された .class ファイルが jar の作成前に削除されることを保証する新しい機能があります (Clojure assembla #322 を参照)。

于 2010-10-31T14:09:11.303 に答える