2010-02-02 5 views
12

Comment puis-je prendre un grand projet Java existant et commencer à ajouter des modules Clojure? Par exemple, dans le code ci-dessous, je voudrais rendre les fonctions suivantes disponibles en Java: état ?, zip ?, état-liste, code postal liste. Les deux prédicats retourneront un booléen, mais les "getters" retourneront des tableaux.Intégrer Clojure dans un projet Java existant?

 
(def *states* (list "NJ" "NY" "CA")) 
(def *zipcodes* (list 12345 54343 98765)) 

(defn member [x sq] 
    (if (seq sq) 
    (if (= x (first sq)) 
     sq 
     (recur x (rest sq))))) 

(defn state? [aState] 
    (not (= (member aState *states*) nil))) 

(defn zip? [aZip] 
    (not (= (member aZip *zipcodes*) nil))) 

(defn state-list [] 
    *states*) 

(defn zipcode-list [] 
    *zipcodes*) 
;; --------------- 
(state? "AA") 
(state? "CA") 
(zip? 11111) 
(zip? 12345) 

Répondre

10

Je compiler en utilisant leininge n puis ajouter le fichier jar à mon projet java comme build dep. Voici un grand video sur l'utilisation de leiningen. alors vous l'appelez directement à partir de Java. Leiningen a une option uberjar qui se développe dans clojure et toutes vos dépendances clojure donc vous n'avez qu'à vous soucier d'un fichier. J'aime ça parce que c'est moins de travail.

Une approche plus amicale java serait d'ajouter une tâche de fourmi de le construire avec le projet java juste un peu plus de travail

pour les fonctions qui doivent renvoyer des tableaux java appropriés appellent to-array sur les

Contrairement à la plupart des hits "clojure from java", vous ne devriez pas avoir besoin d'appeler clojure runtime RT.

PS: ma ligne tag préférée « Je voudrais utiliser une bibliothèque java appelé clojure » J'ai demandé Rich, il a dit que c'était cool;)

+0

Je regardais le README de Leiningen, mais je ne vois rien qui explique cela. Connaissez-vous des blogs, etc. qui peuvent expliquer cela en détail? Comment mes listes seront-elles renvoyées à Java, par exemple? –

+0

vous convertissez le vecteur clojure en une liste Java avec to-list et le renvoyer à partir de la fonction. plus ici: http://clojure.org/java_interop#toc27 –

+1

Je pense que les filets manquent d'explications à ce sujet. –

2

Il est plus facile de prendre une application Java existante et l'envelopper dans Clojure que l'inverse, parce que Java interop de Clojure est très simple. Comme vous demandez comment accéder à Clojure à partir de Java, la réponse est que vous devez soit amorcer le chargement du code Clojure, soit générer des fichiers de classe Java pouvant être utilisés à partir de votre projet Java. Bootstrapping implique de lier au pot de clojure et d'accéder à la fonction de chargement pour charger la source de clojure. Pour générer des classes Java, regardez dans AOT (voir l'exemple sur le site Web).

+5

Je doute que beaucoup de gens aient la possibilité de transformer un projet Java existant en un projet "Clojure". La seule solution réaliste est de permettre à l'équipe de continuer à Java et de permettre qu'une partie du projet se fasse à Clojure, ce qui rend le fait que vous utilisez Clojure quelque peu transparent. –

+0

En fait, j'ai exactement l'opinion contraire :) Pensez-y en termes de Python/C++, les gens ont beaucoup de C++ hérité enveloppé en Python ... pas tellement d'applications héritées C++ appelant Python. –

+0

Lisp est une vente beaucoup plus difficile que Python. –

2

Mon approche recommandée est la suivante:

  • Continuer à gérer le projet Java avec tout ce que vous principal outil de construction est (probablement Maven?)
  • Ajouter Clojure comme une dépendance. Il fonctionnera comme n'importe quelle autre bibliothèque .jar fichier
  • Appelez le code Clojure à partir de Java. Un cas d'utilisation typique serait de require un espace de noms pour ce faire, saisir une référence à tout ce qui IFn que vous voulez appeler et appeler la fonction via IFn.invoke

Je recommande cette approche, car il est généralement plus simple d'ajouter Clojure à un Projet Java au lieu de l'inverse: ceci est particulièrement vrai si vous avez d'autres développeurs à considérer ou utilisez des outils qui supposent un projet Java normal.C'est aussi moins effrayant pour les gestionnaires: tout ce que vous faites est d'utiliser une petite bibliothèque Java supplémentaire :-)

J'ai fait une petite bibliothèque utilitaire qui fait le travail nécessaire pour appeler Clojure de Java et que vous pouvez trouver utile :

Questions connexes