¿Cómo puedo minimizar la compilación AOT en Leiningen (Clojure)
Pregunta
Cuando se crea un proyecto con Clojure Leiningen todos los archivos * .clj-son compilados AOT. Normalmente la compilación AOT no es necesario y me gustaría minimizarlo.
Esto es necesario para mí para elevar la aceptación de Clojure como complemento en un entorno Java dominada. Es más fácil "vender" una sola clase de archivo que el pegamento junto con un par de CLJ-kB archivos frente a la alternativa de tener 250 + kB clase-archivos con nombres extraños y ocultos entre ellos un poco CLJ-archivo (que ISN 't leer incluso más durante la ejecución).
Lo ideal sería el resultado de "Lein compilación" sería sólo un único archivo de clase pequeña, que (junto con los CLJ-archivos y la biblioteca-clojure) implementa la clase necesaria instancia.
¿Cuál es la forma más fácil de lograr esto? Yo preferiría no escribir una sola línea de Java (por supuesto).
Update después de la retroalimentación de Tecnomancia
No sospecha que esta siendo un problema Leiningen. Voy a explicar lo que busco con un ejemplo. Por favor, perdona la longitud del ejemplo. Estoy usando Leiningen 1.3.1 pero creo 1.4.0-Snapshoot se comporta de la misma manera.
$ lein new dummy
Created new project in: dummy
$ cd dummy
Ahora cambio project.clj a (añadido ": dummy.core principal"):
(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)
y src / maniquí / core.clj a:
(ns dummy.core
(:gen-class))
(defn -main [& args]
(println "This is Clojure code, args=" args))
Ahora compila:
$ lein compile
Compiling dummy.core
Esto genera los siguientes archivos en el clases / maniquí
core.class
core__init.class
core$loading__4410__auto__.class
core$_main.class
Todo esto es correcto, puedo ejecutar el resultado:
$ java -cp lib/*:classes dummy.core Hello
This is Clojure code, args= (Hello)
Ahora viene lo que yo quiero tener lugar, pero hacerlo de forma manual: Me puede Eliminar todos los archivos de clase, excepto core.class y copiar el core.clj en clases / maniquí , que ahora se ve muy vacío:
$ ls classes/dummy/
core.class
core.clj
El core.class contiene código para cargar el core.clj en tiempo de ejecución y el resultado sigue siendo el mismo, todavía puedo hacer:
$ java -cp lib/*:classes dummy.core Hello
This is Clojure code, args= (Hello)
También puede modificar core.clj. (Nota: en clases / maniquí ) y de los cambios de rumbo no es necesario volver a compilar
Ahora mi pregunta se reduce a esto:? ¿Existe una manera más fácil de obtener sólo esta core.class
Solución
Leiningen ha hecho ningún AOT por defecto para bastante tiempo; tal vez usted tiene una versión anterior? Pero hay una nueva característica (en 1.4.0-SNAPSHOT) que asegura .class archivos creados debido a transitiva AOT se eliminan antes de la creación frasco, (ver Clojure assembla # 322), que también te pueden interesar.