Come posso ridurre al minimo la compilazione AOT a Leiningen (Clojure)
Domanda
Quando si crea un progetto Clojure con Leiningen tutte le .clj-files * sono compilati AOT. Normalmente la compilazione AOT non è necessario e vorrei minimizzarlo.
Questo è necessario per me per alzare l'accettazione di Clojure come complemento in un ambiente Java-dominato. E 'più facile "vendere" una singola classe-file come la colla insieme con un paio di kB CLJ-file contro l'alternativa di dover 250+ KB classe-file con nomi strani e nascosto tra loro un po' CLJ-file (che isn 't ancora legge le più durante l'esecuzione).
Idealmente il risultato di "Lein compilazione" sarebbe solo un singolo file di classe piccola, che (insieme ai CLJ-file e il clojure-libreria) implementa la necessaria classe di istanza.
Qual è il modo più semplice per raggiungere questo obiettivo? Io preferirei non scrivere una sola riga di Java (ovviamente).
Aggiornamento dopo il feedback da tecnomanzia
Non sospetto che questo sia un problema Leiningen. Lasciatemi spiegare quello che sono dopo con un esempio. Si prega di perdonare la lunghezza della esempio. Sto usando Leiningen 1.3.1 ma penso 1.4.0-snapshoot si comporta allo stesso modo.
$ lein new dummy
Created new project in: dummy
$ cd dummy
Ora cambiamento project.clj a (aggiunto ": dummy.core principale"):
(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 / manichino / core.clj a:
(ns dummy.core
(:gen-class))
(defn -main [& args]
(println "This is Clojure code, args=" args))
Ora compilarlo:
$ lein compile
Compiling dummy.core
Questo genera i seguenti file in classi / manichino :
core.class
core__init.class
core$loading__4410__auto__.class
core$_main.class
Questo è tutto corretto, posso eseguire il risultato:
$ java -cp lib/*:classes dummy.core Hello
This is Clojure code, args= (Hello)
Ora arriva quello che voglio avere, invece, ma farlo manualmente: Che posso Elimina tutti i file di classe ad eccezione di core.class e copiare il core.clj in classi / manichino , che ora sembra molto vuota:
$ ls classes/dummy/
core.class
core.clj
Il core.class contiene il codice per caricare il core.clj in fase di esecuzione e il risultato è sempre lo stesso, posso ancora fare:
$ java -cp lib/*:classes dummy.core Hello
This is Clojure code, args= (Hello)
I può anche modificare core.clj. (Nota: in classi / manichino ) e delle variazioni di rotta non hanno bisogno di essere ricompilati
Ora la mia domanda si riduce a questo: C'è un modo più semplice per ottenere proprio questo core.class
Soluzione
Leiningen ha fatto nulla di AOT di default per un bel po 'di tempo; Forse avete una versione precedente? Ma v'è una nuova funzionalità (in 1.4.0-SNAPSHOT) che i file .class accerta creati a causa di transitiva AOT vengono eliminati prima della creazione vaso, (vedi Clojure assembla # 322) che possono anche interessare.