(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 :
Utwórz nowy projekt wtyczki owijania plik jar Clojure 1.3.0, zestaw wtyczek ID
org.clojure.v1.3.0
Tworzenie nowego projektu za pomocą wtyczki
org.cljtest42
RCP Witam szablon- Dodawanie
org.clojure
zależność plugin - Dodawanie charakter projektu CCW (aby umożliwić AOT kompilacji), ten krok dodaje folderowi
/classes
Edycjaplugin.xml
dodać/classes
folderu z czasem przebiegu ścieżki klasy, również dodaćorg.cljtest42
do eksportowanych paczek.
- Dodawanie
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]))
wyzwalania AOT kompilacji wybierając węzeł projektu i wybierz opcję Uruchom> Aplikacja Clojure (Folderpowinien zostać wypełniony skompilowanymi klasami clojure).
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!
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
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. –
To zakłada, że jesteś gotów, aby AOT swój kod clojure. – Bill