Когда вы создаете проект Clojure с leiningen, все * .clj-файлы скомпилированы AOT. Обычно компиляция AOT не нужна, и я хотел бы свести ее к минимуму.Как скомпилировать AOT-компиляцию в leiningen (Clojure)
Это необходимо для того, чтобы поднять Clojure в качестве дополнения в среде с преобладанием Java. Легче «продать» один класс-файл как клей вместе с несколькими kB-файлами kb против альтернативы иметь 250+ kB класс-файлы со странными именами и скрытый среди них небольшой clj-файл (который не является даже не читайте во время исполнения).
В идеале результат «компиляции lein» будет представлять собой только один файл небольшого класса, который (вместе с clj-файлами и библиотекой clojure) реализует необходимый экземпляр класса.
Что такое самый простой способ достичь этого? Я бы предпочел не писать одну строку Java (конечно).
Update после обратной связи от technomancy
Я не подозреваю, что это является проблемой Leiningen. Позвольте мне объяснить, что я делаю с примера. Прошу простить длину примера. Я использую leiningen 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/манекена/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 и копия 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?
Я использую 1.3.1. и leiningen, конечно, не виноват. Однако, когда я делаю «lein new dummy», заполните dummy/core.clj некоторым «defn» и добавьте «: main dummy.core» в project.clj, тогда «lein compile» создает множество файлов классов. Опять же, это, вероятно, правильно (лейн никогда не ошибается!), Но я хотел бы знать, как это предотвратить. – jramb
Да, вас укусит ошибка Clojure # 322: https://www.assembla.com/spaces/clojure/tickets/322-enhance-aot-compilation-process-to-emit-classfiles-only-for- явно обозначенные пространства имен Leiningen 1.4 будет содержать обходной путь для этой проблемы. Он должен быть выпущен через неделю или около того; если вам это нужно раньше, вы можете бежать от git. – technomancy
Спасибо за отзыв, technomancy! Я с нетерпением жду нового релиза. Выше я попытался объяснить более подробно то, что хочу сделать. Хотя я понимаю взаимосвязь ошибки № 322 с моей проблемой, я надеюсь, что мой гораздо проще решить. :-) – jramb