Как я могу минимизировать сборку AOT в Лейнингене (Clojure)
Вопрос
Когда вы создаете проект Clojure с Leiningen, все файлы * .Clj скомпилированы AOT. Обычно компиляция AOT не нужна, и я хотел бы минимизировать его.
Мне необходимо повысить принятие Clojure в качестве дополнения в среде, доминирующую в Java. Легче «продавать» один класс-файл в виде клея вместе с парой KB CLJ-файлами против альтернативы наличия 250+ класс классов Kb со странными именами и скрытым среди них немного CLJ-файл (который ISN Даже даже читайте больше во время выполнения).
В идеале результат «компиляции Лейна» будет только один маленький файл классов, который (вместе с CLJ-файлами и библиотекой Clojure) реализуют необходимый класс-экземпляр.
Какой самый простой способ достичь этого? Я бы предпочел не писать одну линию Java (конечно).
Обновление после отзывы от Technamancy
Я не подозреваю, что это проблема Лейнингена. Позвольте мне объяснить, что я тогда с примером. Пожалуйста, прости длину примера. Я использую Leinhen 1.3.1, но я думаю, что 1.4.0-Snapshoot ведет себя так же.
$ lein new dummy
Created new project in: dummy
$ cd dummy
Теперь измените Project.clj до (добавлено ": главный 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
Это генерирует следующие файлы в Классы / манекен:
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.Cass. а также скопировать 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 (Примечание: в Классы / манекен!) И конечно изменения не нужно перекомпилировать.
Теперь мой вопрос сводится к этому: Есть ли более простым способом получить только это CORE.Class?
Решение
Лейнинден не сделал не так, по умолчанию уже некоторое время; Возможно, у вас старая версия? Но есть новая функция (в 1.4.0-Snapshot), которая обеспечивает .Class файлы, созданные из-за транзитивных AOT, удаляются до создания JAR, (см. Clojure Assumbla # 322), которые также могут вас заинтересовать.