2010-10-31 2 views
2

Когда вы создаете проект 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?

ответ

4

Leiningen не сделал AOT по умолчанию в течение довольно длительного времени; возможно, у вас более старая версия? Но есть новая функция (в 1.4.0-SNAPSHOT), которая гарантирует, что файлы .class, созданные из-за транзитивности AOT, будут удалены до создания jar (см. Clojure assemblyla # 322), которые также могут вас заинтересовать.

+0

Я использую 1.3.1. и leiningen, конечно, не виноват. Однако, когда я делаю «lein new dummy», заполните dummy/core.clj некоторым «defn» и добавьте «: main dummy.core» в project.clj, тогда «lein compile» создает множество файлов классов. Опять же, это, вероятно, правильно (лейн никогда не ошибается!), Но я хотел бы знать, как это предотвратить. – jramb

+0

Да, вас укусит ошибка Clojure # 322: https://www.assembla.com/spaces/clojure/tickets/322-enhance-aot-compilation-process-to-emit-classfiles-only-for- явно обозначенные пространства имен Leiningen 1.4 будет содержать обходной путь для этой проблемы. Он должен быть выпущен через неделю или около того; если вам это нужно раньше, вы можете бежать от git. – technomancy

+0

Спасибо за отзыв, technomancy! Я с нетерпением жду нового релиза. Выше я попытался объяснить более подробно то, что хочу сделать. Хотя я понимаю взаимосвязь ошибки № 322 с моей проблемой, я надеюсь, что мой гораздо проще решить. :-) – jramb

Смежные вопросы