Mój zespół ma teraz kompilację Scala i jej wykonanie działające na Scalate w obrębie OSGi.
Ogólnie, ustawienia ScalaCompiler powinny być dostarczane z zestawem obiektów AbstractFile, które odpowiadają odpowiednim pakunkom OSGi. Jest to obsługiwane przez Guggla zgodnie z odnośnikiem @michid. Ale podczas gdy Guggla dostarcza warstwę AbstractFile, nie dostarcza jeszcze żadnych przykładów ani kodu do tworzenia instancji AbstractFile w środowisku OSGi. Przykładowy kod do tego ostatniego można znaleźć w projekcie Sling (pochodzenie samego Guggla), a także w projekcie Scalate (patrz ScalaCompiler, ale zauważmy poniżej nasze zmiany).
Wybraliśmy pakiety OSGi-ified scala (compiler i library) z projektu ServiceMix. Zobacz issue SMX-1048 (with patch) na pakiecie kompilatora scala.
Naszą pierwotną intencją było, aby działało to w wersji skalowanej, a reszta tej odpowiedzi jest specyficzna dla tego projektu.
Kod Scalate zawierał już większość logiki niezbędnej do pracy w środowisku OSGi, w tym wirtualną warstwę AbstractFile, a także ustawianie ścieżki klasy kompilatora. Jednak musieliśmy załatać Scalate (https://github.com/scalate/scalate/pull/16), aby to działa:
1) OsgiCompiler przesłanianie klasy ScalaCompiler nie był prawidłowo włączona, a więc pakiet nie były wykrywane jako wejścia ścieżki klasy do kompilatora i
2) Program ładujący klasy wykonawczej (czas wykonywania) został ustawiony na program ładujący klasy pakietu scalate-core, co powoduje, że w środowisku wykonawczym CNFE.
Powyższe żądanie ściągnięcia konfiguruje skalowanie w środowisku OSGi do domyślnego programu ładującego klasy kontekstowego wątku w środowisku wykonawczym. Wydaje się, że jest to najprostszy sposób, aby uzyskać odwołanie do programu ładującego klasy dzwoniącego bez konieczności jawnego wstrzykiwania go przez wywołującego (na przykład deklaracja Spring-DM osgi:service
eksportująca usługę szablonu może użyć atrybutu context-class-loader="service-provider"
, aby ustawić to automatycznie. zachowanie w czasie działania Skalate OSGi odpowiada istniejącemu zachowaniu podczas kompilacji, które już używało TCCL:
Dlatego wywołujący Scalate powinien ustawić TCCL na swój własny moduł ładujący klasy lub jawnie wprowadzić pożądany moduł ładujący klasy do silnika szablonu, np. templateEngine.classLoader = ...
przed wykonaniem szablonu
Aktualizacja 31-sie-2012: Scalate-Master zawiera teraz wszystkie poprawki wspomniane w tym poście:
Aktualizacja 10-kwi-2013: Scalate 1.6.1 z kompilacją szablonów wykonawczych za pośrednictwem kompilatora Scala jest zgodna z OSGi. Również Scala 2.10 i wyższe są poprawnymi pakietami OSGi.
Silnik skryptowy Scala z serwera Apache Sling został przeniesiony do własnego domu na stronie https://github.com/guggla/guggla. Obecnie jest na Scali 2.9, ale nie powinno być zbyt trudne, aby działało z 2.9.1. Aby uzyskać więcej informacji, zobacz moje slajdy z sesji http://people.apache.org/~mduerig/scala4sling/ i http://people.apache.org/~mduerig/scala4scripting/ – michid
@michid: Doskonale, dziękuję za linki. Zbadam dalej. – Raman