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

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top