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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top