Como posso minimizar a compilação AOT em Leiningen (Clojure)
Pergunta
Quando você cria um projeto de clojure com Leiningen, todos os *.clj-Files são compilados aot. Normalmente, a compilação AOT não é necessária e eu gostaria de minimizá -la.
Isso é necessário para eu aumentar a aceitação do clojure como um complemento em um ambiente dominado por Java. É mais fácil "vender" um único arquivo de classe, pois a cola junto com alguns Kb CLJ-Files contra a alternativa de ter mais de 250 kb de arquivos de classe com nomes estranhos e escondidos entre eles um pouco até ler mais durante a execução).
Idealmente, o resultado do "Lein Compile" seria apenas um único arquivo de classe pequena que (juntamente com os arquivos CLJ e a biblioteca de clojure) implementa a instância de classe necessária.
Qual é a maneira mais fácil de conseguir isso? Eu preferiria não escrever uma única linha de Java (é claro).
Atualização após o feedback da Technomancy
Não suspeito que este seja um problema de Leiningen. Deixe -me explicar o que estou buscando com um exemplo. Por favor, perdoe a duração do exemplo. Estou usando o Leiningen 1.3.1, mas acho que o 1.4.0-SNAPSHOOT se comporta da mesma maneira.
$ lein new dummy
Created new project in: dummy
$ cd dummy
Agora altere o Project.clj para (adicionado ": 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)
e src/dummy/core.clj para:
(ns dummy.core
(:gen-class))
(defn -main [& args]
(println "This is Clojure code, args=" args))
Agora compile:
$ lein compile
Compiling dummy.core
Isso gera os seguintes arquivos em Aulas/manequim:
core.class
core__init.class
core$loading__4410__auto__.class
core$_main.class
Tudo isso está correto, eu posso executar o resultado:
$ java -cp lib/*:classes dummy.core Hello
This is Clojure code, args= (Hello)
Agora vem o que eu quero ter, mas eu faço isso manualmente: eu posso excluir Todos os arquivos de classe, exceto Core.class e cópia de o núcleo.clj em Aulas/manequim que agora parece muito vazio:
$ ls classes/dummy/
core.class
core.clj
O Core.class contém código para carregar o núcleo.clj no tempo de execução e o resultado ainda é o mesmo, ainda posso fazer:
$ java -cp lib/*:classes dummy.core Hello
This is Clojure code, args= (Hello)
Eu também posso modificar o Core.clj (Nota: em Aulas/manequim!) E, claro, as mudanças não precisam ser recompiladas.
Agora minha pergunta se resume a isso: Existe uma maneira mais fácil de obter apenas esse núcleo.class?
Solução
Leiningen não fez AOT por padrão há algum tempo; Talvez você tenha uma versão mais antiga? Mas existe um novo recurso (em 1.4.0-SNAPSHOT) que garante arquivos .classe criados devido ao AOT transitivo é excluído antes da criação do JAR (consulte Clojure Assemblla #322) que também pode lhe interessar.