Проблема Clopure classpath в плагине Eclipse - PullRequest
5 голосов
/ 05 ноября 2011

(я знаю, что это связано с Как я могу встроить Clojure в приложение RCP , но этот поток устарел, и мои настройки несколько отличаются)

Я использую Eclipse 3.7.1 и уже несколько дней пытаюсь написать приложение Eclipse / RCP на Clojure (насколько это возможно). Я пытался создать исходную версию clojure.osgi и CCW , пробовал демонстрационный проект RCPClojure и несколько других вещей. Каждый из них не работал (в основном, казалось бы, «нефиксированные» ошибки сборки / пути к классам, отсутствие актуальных документов / ответов, конфликт версий и т. Д.)

Мои собственные шаги, чтобы принести мне как минимум 50% успеха:

  1. Создание нового проекта плагина, оборачивающего файл jar Clojure 1.3.0, установка идентификатора плагина org.clojure.v1.3.0

  2. Создание нового проекта плагина org.cljtest42 с использованием шаблона RCP Hello

    1. Добавление org.clojure зависимостей плагина
    2. Добавление характера проекта CCW (для включения компиляции AOT), этот шаг добавляет папку /classes
    3. Отредактируйте plugin.xml, чтобы добавить папку /classes в classpath среды выполнения, а также добавьте org.cljtest42 в экспортируемые пакеты.
  3. Добавьте два простых файла Clojure в пакет / пространство имен org.cljtest42:

    TestClass.clj:

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

    compile.clj

    (ns org.cljtest42.compile)
    (dorun (map compile ['org.cljtest42.TestClass]))
    
  4. Запустите компиляцию AOT, выбрав узел проекта и выберите «Выполнить»> «Приложение Clojure» (теперь папка /classes должна быть заполнена скомпилированными классами Clojure).

  5. Ссылочный TestClass из класса Activator (например, в start () - также пытался в Perspective.createInitialLayout ())

Пока все хорошо. Однако, попытка запустить этот проект как приложение Eclipse всегда терпит неудачу с этим:

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)

Было бы замечательно, если бы кто-то более знающий мог поделиться некоторыми указаниями о том, как можно решить эту проблему. Возможно, это связано с тем, что скомпилированные классы AOT на самом деле не попадают в путь к классам (не уверен почему? работает?

Спасибо!

1 Ответ

1 голос
/ 06 декабря 2011

Кажется, проблема в том, что пакет Clojure не видит классы вашего пакета, хотя вы их экспортировали.Это связано с тем, что в OSGi (как вы, вероятно, знаете), чтобы пакет мог видеть класс, его пакет должен быть импортирован.

Но как насчет случаев, когда пакет должензагрузить класс из пакета, который его вызвал.Чтобы это работало, Eclipse внедрил политики друзей , которые предназначены именно для этого случая:

  1. В вашем пакете Clojure должен быть заголовок манифеста Eclipse-BuddyPolicy: [dependent|registered].
  2. Если вы добавили Eclipse-BuddyPolicy: registered, вам нужно добавить заголовок манифеста к пакетам, который использует Clojure: Eclipse-RegisterBuddy: <clojure-bundle-name>

Отказ от ответственности: у меня нет опытас Clojure, но я хотел сделать снимок.

...