2011-11-05 12 views
5

(Jestem świadomy jest to związane z How can I embed Clojure in an RCP application, ale wątek jest stary i moja konfiguracja jest nieco inna)Clojure problem classpath wewnątrz wtyczki Eclipse

Używam Eclipse 3.7.1 i przez kilka dni teraz próbowałem napisać aplikację Eclipse/RCP w Clojure (w miarę możliwości). Próbowałem już zbudować wersję źródłową clojure.osgi i CCW, wypróbowałem projekt demonstracyjny RCPClojure i kilka innych rzeczy. Każdy z nich nie działał (głównie pozornie "nieusuwalne" błędy kompilacji/classpath, brak aktualnych dokumentów/odpowiedzi, konflikty wersji itp.)

Moje własne kroki, które przyniosą mi co najmniej 50% sukcesu :

  1. Utwórz nowy projekt wtyczki owijania plik jar Clojure 1.3.0, zestaw wtyczek ID org.clojure.v1.3.0

  2. Tworzenie nowego projektu za pomocą wtyczki org.cljtest42 RCP Witam szablon

    1. Dodawanie org.clojure zależność plugin
    2. Dodawanie charakter projektu CCW (aby umożliwić AOT kompilacji), ten krok dodaje folderowi
    3. /classes Edycja plugin.xml dodać /classes folderu z czasem przebiegu ścieżki klasy, również dodać org.cljtest42 do eksportowanych paczek.
  3. Dodaj dwa proste pliki Clojure w org.cljtest42 pakietu/nazw:

    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. wyzwalania AOT kompilacji wybierając węzeł projektu i wybierz opcję Uruchom> Aplikacja Clojure (Folderpowinien zostać wypełniony skompilowanymi klasami clojure).

  5. referencyjny TestClass z klasy Activator (np w start() - również próbował w Perspective.createInitialLayout())

tej pory tak dobrze. Jednak próby uruchomienia tego projektu jako aplikacja Eclipse zawsze kończy się niepowodzeniem z tego:

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) 

Byłoby wybitny jeśli ktoś bardziej kompetentny mógłby podzielić się kilka wskazówek, w jaki sposób problem ten można przezwyciężyć. Możliwe, że dzieje się tak dlatego, że klasy skompilowane z AOT w rzeczywistości nie trafiają do ścieżki klas (nie wiesz, dlaczego ?,/classes jest jawnie dodana) lub że oddzielna wtyczka Clojure nie może uzyskać do nich dostępu ze względu na sposób Equinox/OSGI Prace?

Dzięki!

Odpowiedz

1

Problem wygląda na to, że pakiet Clojure nie widzi zajęć twojego pakietu, mimo że je wyeksportowałeś. Dzieje się tak, ponieważ w OSGi (jak zapewne wiesz), aby pakiet mógł zobaczyć klasę, jego pakiet musi zostać zaimportowany.

Ale co z przypadkami, w których pakiet musi załadować klasę z pakietu, który ją nazwał. Aby to zadziałało, Eclipse wdrożył buddy policies, które są przeznaczone właśnie dla tego przypadku:

  1. Twój pakiet Clojure musi mieć oczywisty nagłówek Eclipse-BuddyPolicy: [dependent|registered].
  2. Jeśli dodaliśmy Eclipse-BuddyPolicy: registered, trzeba dodać nagłówek do oczywistego wiązek, który korzysta Clojure: Eclipse-RegisterBuddy: <clojure-bundle-name>

Zastrzeżenie: Nie mam żadnego doświadczenia z Clojure, ale chciałem zabrać strzał w to.

+0

To działa. Oto kilka dodatkowych uwag. 1) W pluginach środowiska wykonawczego Clojure musisz wyeksportować wszystkie pakiety w słoiku. 2) Powinieneś prawdopodobnie użyć 'Eclipse-BuddyPolicy: registered' w plugin'u runtime, a następnie odpowiadającym wpisowi' Eclipse-RegisterBudy' w zależnej wtyczce. 3) Jeśli twoja zależna wtyczka jest wywoływana przez inne wtyczki, które nie zależą bezpośrednio od twojej wtyczki Clojure, twoja zależna wtyczka musi ponownie wyeksportować zależność środowiska wykonawczego Clojure. – Bill

+0

Jest to prawdopodobnie wystarczające obejście problemu, ale właściwym sposobem na wykonanie tej czynności jest fakt, że Aloeure Clojure wstrzykuje niezbędne importy do pakietu, więc nie trzeba używać kumpli Eclipse, ponieważ jest to zgodne ze specyfikacją OSGi. Ale to wymagałoby Clojure AOT, aby postąpić słusznie. –

+0

To zakłada, że ​​jesteś gotów, aby AOT swój kod clojure. – Bill