2010-02-02 8 views
12

¿Cómo puedo tomar un gran proyecto de Java existente y comenzar a agregar los módulos de Clojure? Por ejemplo, en el siguiente código, me gustaría que las siguientes funciones estén disponibles en Java: state ?, zip ?, state-list, zipcode-list. Los dos predicados devolverán un valor booleano, pero los "getters" devolverán los arrays.¿Cómo integrar Clojure en un proyecto Java existente?

 
(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) 

Respuesta

10

Me compilarlo usando leininge n continuación añadir el archivo jar a mi proyecto Java como un dep build. Aquí hay un gran video sobre el uso de leiningen. entonces lo llamarías directamente desde java. Leiningen tiene una opción uberjar que funciona en clojure y en todas sus dependencias clojure, por lo que solo debe preocuparse por un archivo. Me gusta esto porque es menos trabajo.

Un enfoque más amigable java sería añadir una tarea de hormiga para construir junto con el proyecto de Java es sólo un poco más de trabajo

para las funciones que necesitan para volver matrices de Java adecuados llaman to-array en ellos

a diferencia de muchos de los mejores éxitos de "llamar a clojure desde java", no debería necesitar llamar al RT de tiempo de ejecución de clojure.

PD: mi lema favorito "Me gustaría utilizar una biblioteca de Java llamada clojure" Pregunté Rich dijo que esto era fresco;)

+0

miré el README Leiningen pero yo no vi nada que explica esto. ¿Conoces algún blog, etc. que pueda explicar esto con cierto detalle? ¿Cómo se devolverán mis listas a Java, por ejemplo? –

+0

convierte el vector clojure a una lista java con to-list y lo devuelve desde la función. más aquí: http://clojure.org/java_interop#toc27 –

+1

Creo que a las redes les faltan explicaciones sobre esto. –

2

Es más fácil tomar una aplicación Java existente y se envuelve en Clojure que al revés, porque la interoperabilidad Java de Clojure es muy simple.

Al preguntar cómo acceder a Clojure desde Java, la respuesta es que o bien necesita cargar código Clojure o debe generar archivos de clase Java que se pueden utilizar desde su proyecto Java. Bootstrapping implica vincular al jarro clojure y acceder a la función de carga para cargar la fuente de clojure. Para generar clases de Java, busque en AOT (consulte el ejemplo en el sitio web).

+5

Dudo que muchas personas tengan la opción de convertir un proyecto heredado de Java en un proyecto "Clojure". La única solución realista es permitir que el equipo continúe en Java y permita que parte del proyecto se realice en Clojure, haciendo que el hecho de que esté utilizando Clojure sea algo transparente. –

+0

En realidad, tengo una opinión completamente opuesta :) Piénselo en términos de Python/C++, la gente tiene mucho C++ heredado envuelto en Python ... no tanto las aplicaciones heredadas de C++ que llaman a Python. –

+0

Lisp es una venta mucho más difícil que Python. –

2

Mi enfoque recomendado es el siguiente:

  • seguir gestionando el proyecto Java con lo que es principal herramienta de construcción (presumiblemente Maven?)
  • Añadir Clojure como dependencia. Funcionará como cualquier otra biblioteca .jar file
  • Llame al código Clojure de Java. Un caso de uso típico sería require un espacio de nombres para hacer esto, toma una referencia a lo IFn al que desea llamar y llamar a la función a través de IFn.invoke

Recomiendo este enfoque, ya que generalmente es más sencillo añadir Clojure a una Proyecto Java en lugar de al revés: esto es especialmente cierto si tiene otros desarrolladores para considerar o está usando herramientas que asumen un proyecto Java normal.También es menos aterrador para los administradores: todo lo que estás haciendo es usar una pequeña biblioteca Java :-)

Creé una pequeña biblioteca de utilidades que hace mucho del trabajo requerido para llamar a Clojure desde Java que puede ser útil :

Cuestiones relacionadas