Как я могу встроить Clojure в приложение RCP - PullRequest
4 голосов
/ 28 февраля 2010

В настоящее время я использую javascript для добавления сценариев в приложение Eclipse RCP, но я бы предпочел использовать Clojure. Однако я столкнулся с трудностями пути к классам, потому что, хотя Eclipse может находить классы Clojure, сам Clojure не может.

Метод запуска активатора плагина:

public void start(BundleContext context) throws Exception {
    super.start(context);
    plugin = this ;
    Class.forName("clojure.lang.RT") ;
    JSController.startup() ;
}

не вызывает класс не найден исключение для clojure.lang.RT , но для clojure / core__init , который находится в том же месте.

java.io.FileNotFoundException: Could not locate clojure/core__init.class or clojure/core.clj on classpath:
        at clojure.lang.RT.load(RT.java:402)
        at clojure.lang.RT.load(RT.java:371)
        at clojure.lang.RT.doInit(RT.java:406)
        at clojure.lang.RT.<clinit>(RT.java:292)

Приложение RCP основано на Eclipse версии 3.1

Кто-нибудь знает, как это исправить?

Ответы [ 3 ]

3 голосов
/ 02 марта 2010

Это было намного проще, чем я думал: я предполагал, что при активации пакета / плагина загрузчик плагинов будет загружен в класс. Это не так, это приложение загрузчик классов.

Итак, решение простое:

Runnable cljRunner = new Runnable(){
    public void run(){
        Thread thisThread = Thread.currentThread() ;
        ClassLoader savedCL = thisThread.getContextClassLoader() ;              
        thisThread.setContextClassLoader(Activator.class.getClassLoader()) ;
        try {
            clojure.lang.Compiler.load(
                new java.io.StringReader(
                        "(require 'clojure.main)\n" +
                        "(require 'swank.swank)\n"  +
                        "(clojure.main/with-bindings\n" +
                        "    (swank.swank/start-server \"nul\" :encoding \"utf-8\" :port 9999))"
                )) ;
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        thisThread.setContextClassLoader(savedCL) ;
    }
} ;
cljThread = new Thread(cljRunner) ;
cljThread.start() ;
2 голосов
/ 02 марта 2010

Вам нужно обернуть Clojure JAR в комплект OSGi, чтобы использовать его в приложении Eclipse RCP. К счастью, это уже было сделано с помощью против часовой стрелки Eclipse.

1 голос
/ 02 марта 2010

Возможно, вам нужно добавить необходимые пути к вашему Bundle-ClassPath в MANIFEST.MF плагина, чтобы загрузчик файлов Clojure мог быть найден загрузчиком классов. Самый простой способ сделать это в eclipse - открыть plugin.xml в редакторе и перейти на вкладку «Runtime».

AFAIK, вам не нужно принудительно загружать классы с помощью Class.forName ("clojure.lang.RT"); - здесь мне это кажется посторонним.

Я заставил свой плагин работать с Clojure, добавив зависимости к плагинам против часовой стрелки (ccw.clojure и ccw.clojurecontrib).

...