2010-10-31 28 views
2

Lorsque vous créez un projet Clojure avec leiningen, tous les fichiers * .clj sont compilés AOT. Normalement, la compilation AOT n'est pas nécessaire et je voudrais le minimiser. Ceci est nécessaire pour que je puisse faire accepter Clojure comme un complément dans un environnement dominé par Java. Il est plus facile de "vendre" un seul fichier de classe en tant que colle avec quelques fichiers kB clj contre l'alternative d'avoir 250+ fichiers de classe kB avec des noms étranges et cachés parmi eux un petit fichier clj (qui est je ne lis même plus pendant l'exécution).Comment réduire la compilation AOT dans leiningen (Clojure)

Idéalement, le résultat de "lein compile" ne serait qu'un seul petit fichier de classe qui (avec les fichiers clj et la bibliothèque clojure) implémente l'instance de classe nécessaire.

Quelle est la manière la plus facile 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. Laissez-moi vous expliquer ce que je suis après avec un exemple. S'il vous plaît pardonner 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 

maintenant changer 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 il:

$ lein compile 
Compiling dummy.core 

Ceci génère les fichiers suivants en classes/mannequin:

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

Tout cela est correct, je peux exécuter le résultat:

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

vient maintenant ce que je veux avoir la place, mais je le fais manuellement: je peux supprimer tous les fichiers de classe, sauf core.class et copie la core.clj dans classes/mannequin 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 : dans classes/dummy!) et bien sûr les modifications n'ont pas besoin d'être recompilées. Maintenant, ma question se résume à ceci: Existe-t-il un moyen plus simple d'obtenir juste ce core.class?

Répondre

4

Leiningen n'a pas fait d'AOT par défaut depuis un certain temps maintenant; peut-être avez-vous une version plus ancienne? Mais il y a une nouvelle fonctionnalité (dans 1.4.0-SNAPSHOT) qui assure que les fichiers .class créés en raison d'AOT transitif soient supprimés avant la création du fichier jar, (voir l'assemblage Clojure # 322) qui peut aussi vous intéresser.

+0

J'utilise 1.3.1. et leiningen n'est pas à blâmer, bien sûr. Cependant, quand je fais "lein new dummy", remplissez le dummy/core.clj avec du "defn" et ajoutez un ": main dummy.core" au projet.clj puis "lein compile" produit beaucoup de fichiers de classe. Encore une fois, c'est probablement correct (lein ne se trompe jamais!), Mais j'aimerais savoir comment éviter cela. – jramb

+0

Ouais, vous êtes mordu par le bug # 322 de Clojure: https://www.assembla.com/spaces/clojure/tickets/322-enhance-aot-compilation-process-to-emit-classfiles-only-for- namespace explicitement spécifié Leiningen 1.4 contiendra une solution de contournement pour ce problème. Il devrait être publié dans une semaine ou deux; Si vous en avez besoin plus tôt, vous pouvez utiliser git. – technomancy

+0

Merci pour les retours, technomancie! J'attends avec impatience la nouvelle version. Ci-dessus, j'ai essayé d'expliquer plus en détail ce que je souhaite accomplir. Bien que je comprenne la relation du bug # 322 à mon problème, j'espère que le mien est beaucoup plus facile à résoudre. :-) – jramb