При создании проекта Clojure с помощью leiningen все * .clj-файлы компилируются AOT. Обычно компиляция AOT не нужна, и я хотел бы свести ее к минимуму.
Это необходимо для того, чтобы повысить признание Clojure в качестве дополнения в среде, где доминирует Java. Проще «продать» один файл класса в качестве клея вместе с парой clj-файлов по килобайту, вместо альтернативы иметь 250+ килобайтные файлы классов со странными именами и спрятать среди них маленький clj-файл (который не даже больше не читал во время исполнения).
В идеале результатом "компиляции lein" должен быть только один маленький файл класса, который (вместе с clj-файлами и библиотекой clojure) реализует необходимый экземпляр класса.
Какой самый простой способ добиться этого? Я бы предпочел не писать ни одной строки Java (конечно).
Обновление после обратной связи от Technomancy
Я не подозреваю, что это проблема leiningen. Позвольте мне объяснить, что я после с примером. Пожалуйста, прости длину примера. Я использую 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?