(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 :
Crear un nuevo proyecto de plugin envolver el archivo jar Clojure 1.3.0, conjunto de plugin ID
org.clojure.v1.3.0
Crear un nuevo proyecto de plugin
org.cljtest42
usando la plantilla RCP Hola- Adición
org.clojure
dependencia complemento - Adición de la naturaleza del proyecto CCW (Para activar la compilación AOT), este paso agrega la carpeta
/classes
- Editar
plugin.xml
añadir/classes
carpeta a la ruta de clase en tiempo de ejecución, también se suman aorg.cljtest42
paquetes exportados.
- Adición
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]))
gatillo AOT seleccionando nodo de proyecto y elija Ejecutar> Aplicación Clojure (La carpetaahora debe estar poblada con clases compiladas de clojure).
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!
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
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. –
Eso presupone que está dispuesto a AOT su código de clojure. – Bill