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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top