Question

Lorsque vous créez un projet avec Clojure Leiningen tous les fichiers * .clj-compilés sont AOT. Normalement, la compilation AOT est pas nécessaire et je voudrais le minimiser.

est nécessaire pour moi de soulever l'acceptation de Clojure comme complément dans un environnement Java dominé. Il est plus facile de « vendre » un seul fichier de classe comme la colle avec quelques kB fichiers CLJ-contre l'alternative d'avoir 250+ kB classe fichiers avec des noms étranges et cachés parmi eux un peu CLJ fichier (qui ISN « t lu même plus en cours d'exécution).

Idéalement, le résultat de « lein compilation » ne serait qu'un petit fichier de classe unique qui (ainsi que les fichiers CLJ-et-clojure bibliothèque) met en œuvre la classe instance nécessaire.

Quelle est la meilleure façon d'y parvenir? Je préférerais ne pas écrire une seule ligne de Java (bien sûr).

Mise à jour après les commentaires de technomancie

Je ne soupçonne pas que ce soit un problème de Leiningen. Permettez-moi de vous expliquer ce que je suis après un exemple. S'il vous plaît pardonnez la longueur de l'exemple. J'utilise Leiningen 1.3.1 mais je pense que 1.4.0-snapshoot se comporte de la même manière.

$ lein new dummy
Created new project in: dummy
$ cd dummy

Aujourd'hui, le changement project.clj à (ajouté ": principal 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)

et src / mannequin / core.clj à:

(ns dummy.core
  (:gen-class))
(defn -main [& args]
  (println "This is Clojure code, args=" args))

Maintenant compiler:

$ lein compile
Compiling dummy.core

Cela génère les fichiers suivants dans cours / mannequin :

core.class
core__init.class
core$loading__4410__auto__.class
core$_main.class

Ceci est tout correct, je peux exécuter le résultat:

$ java -cp lib/*:classes dummy.core Hello
This is Clojure code, args= (Hello)

Voici maintenant ce que je veux avoir la place, mais je le faire manuellement: Je peux Supprimer tous les fichiers de classe, sauf core.class et copier core.clj dans cours / factice qui semble maintenant très vide:

$ ls classes/dummy/
core.class
core.clj

Le core.class contient le code pour charger le core.clj lors de l'exécution et le résultat est toujours le même, je peux encore faire:

$ java -cp lib/*:classes dummy.core Hello
This is Clojure code, args= (Hello)

Je peux aussi modifier core.clj. (Note: cours / factice ) et des changements de cours ne doivent pas nécessairement être recompilé

Maintenant, ma question se résume à ceci: Est-il un moyen plus facile d'obtenir tout ce core.class

Était-ce utile?

La solution

Leiningen a pas fait AOT par défaut depuis un certain temps; peut-être vous avez une ancienne version? Mais il y a une nouvelle fonctionnalité (1.4.0-snapshot) que les fichiers créés en raison de Se assure transitif AOT get avant la création de Deleted pot, (voir Clojure assembla # 322) qui peut aussi vous intéresser.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top