2011-11-05 8 views
5

(soy consciente de que esto está relacionado con How can I embed Clojure in an RCP application, pero ese hilo es viejo y mi configuración es algo diferente)cuestión ruta de clase Clojure dentro de un plugin de Eclipse

Estoy usando Eclipse 3.7.1 y para los días ahora tienen estado tratando de escribir una aplicación Eclipse/RCP en Clojure (tanto como sea posible). He intentado construir la versión de origen de clojure.osgi y CCW, he intentado el proyecto de demostración RCPClojure y varias otras cosas. Cada uno de ellos no funcionó (principalmente errores de compilación/classpath aparentemente no corregibles, falta de docs/response actualizados, conflictos de versiones, etc.)

Mis propios pasos para darme un 50% de éxito como mínimo :

  1. Crear un nuevo proyecto de plugin envolver el archivo jar Clojure 1.3.0, conjunto de plugin ID org.clojure.v1.3.0

  2. Crear un nuevo proyecto de plugin org.cljtest42 usando la plantilla RCP Hola

    1. Adición org.clojure dependencia complemento
    2. Adición de la naturaleza del proyecto CCW (Para activar la compilación AOT), este paso agrega la carpeta /classes
    3. Editar plugin.xml añadir /classes carpeta a la ruta de clase en tiempo de ejecución, también se suman a org.cljtest42 paquetes exportados.
  3. Añadir dos archivos simples Clojure en el org.cljtest42 paquete/espacio de nombres:

    TestClass.clj:

    (ns org.cljtest42.TestClass 
    (:gen-class)) 
    
    (defn -main [greet] (println greet)) 
    

    compile.clj

    compilación
    (ns org.cljtest42.compile) 
    (dorun (map compile ['org.cljtest42.TestClass])) 
    
  4. gatillo AOT seleccionando nodo de proyecto y elija Ejecutar> Aplicación Clojure (La carpetaahora debe estar poblada con clases compiladas de clojure).

  5. Referencia TestClass de la clase Activator (por ejemplo, en start() - también se trató en Perspective.createInitialLayout())

Hasta aquí todo bien. Sin embargo, tratar de ejecutar este proyecto como una aplicación Eclipse siempre falla con esto:

java.io.FileNotFoundException: Could not locate org/cljtest42/TestClass__init.class or org/cljtest42/TestClass.clj on classpath: 
at clojure.lang.RT.load(RT.java:430) 
at clojure.lang.RT.load(RT.java:398) 
at clojure.core$load$fn__4610.invoke(core.clj:5386) 
at clojure.core$load.doInvoke(core.clj:5385) 
at clojure.lang.RestFn.invoke(RestFn.java:408) 
at clojure.lang.Var.invoke(Var.java:401) 
at com.pspctclr.cljtest42.TestClass.<clinit>(Unknown Source) 

Sería excelente si alguien más conocedor podría compartir algunos consejos sobre cómo este problema podría ser superado. ¿Podría ser que sea porque las clases compiladas AOT no terminan realmente en la ruta de clases (no estoy seguro de por qué?/Clases se agrega explícitamente) o que el complemento Clojure por separado no puede acceder a ellas debido a la forma Equinox/OSGI ¿trabajos?

Gracias!

Respuesta

1

Parece que el paquete Clojure no ve las clases de su paquete, aunque las haya exportado. Esto es porque, en OSGi (como probablemente sabrá), para que un paquete pueda ver una clase, su paquete necesita ser importado.

Pero, ¿qué pasa con los casos en que un paquete necesita cargar una clase de un paquete, que lo ha llamado así? Para que esto funcione, Eclipse ha implementado buddy policies, que están diseñados precisamente para este caso:

  1. su paquete Clojure necesita tener cabecera de manifiesto Eclipse-BuddyPolicy: [dependent|registered].
  2. Si ha añadido Eclipse-BuddyPolicy: registered, necesitará añadir cabecera de manifiesto a los haces, que utiliza Clojure: Eclipse-RegisterBuddy: <clojure-bundle-name>

de responsabilidad: No tengo ninguna experiencia con Clojure, pero quería tener una oportunidad de esto.

+0

Esto funciona. Aquí hay algunas notas adicionales. 1) En su complemento de tiempo de ejecución de Clojure, debe exportar todos los paquetes en el contenedor. 2) Probablemente deberías usar 'Eclipse-BuddyPolicy: registered' en el plugin de tiempo de ejecución y luego la entrada' Eclipse-RegisterBudy' correspondiente en el complemento dependiente. 3) Si su plugin dependiente es llamado por otros complementos que no dependen directamente de su plugin Clojure runtime, entonces su plugin dependiente debe reexportar la dependencia del tiempo de ejecución de Clojure. – Bill

+0

Probablemente sea una solución bastante buena, pero la forma correcta de hacerlo es que Clojure AOT inyecte realmente las importaciones necesarias en el paquete, para que no tenga que usar los amigos de Eclipse mientras se está realizando la especificación OSGi. Pero esto requeriría que Clojure AOT hiciera lo correcto. –

+0

Eso presupone que está dispuesto a AOT su código de clojure. – Bill

Cuestiones relacionadas