У моей команды теперь есть компиляция и выполнение Scala для Scalate в OSGi.
В общем, настройки ScalaCompiler должны быть предоставлены с набором объектов AbstractFile, которые соответствуют соответствующим пакетам OSGi.Это поддерживается Guggla , на который ссылается @michid.Но хотя Guggla предоставляет слой AbstractFile, он еще не предоставляет ни примеров, ни кода для создания экземпляров AbstractFile в среде OSGi.Пример кода для этого можно найти в проекте Sling (происхождение самого Guggla), а также в проекте Scalate (см. ScalaCompiler , но обратите внимание на наши изменения в нем ниже).
Мы выбрали OSGi-ified scala bundles ( компилятор и библиотека ) из проекта ServiceMix.См. выпуск SMX-1048 (с патчем) в комплекте scala-компилятора.
Нашей первоначальной целью было добиться того, чтобы это работало в Scalate, поэтому остальная часть этого ответа относится именно к этому.project.
В Scalate-коде уже была большая часть логики, необходимой для работы в среде OSGi, включая виртуальный уровень AbstractFile, а также установку пути к классам компилятора.Однако нам нужно было исправить Scalate (https://github.com/scalate/scalate/pull/16), чтобы заставить его работать:
1) Переопределение OsgiCompiler класса ScalaCompiler не было включено должным образом, и поэтому пакеты не были обнаружены как входы classpath длякомпилятор и
2) Загрузчик классов выполнения (во время выполнения) был настроен на загрузчик классов пакета с ядром скалирования, что приводило к CNFE во время выполнения.
Запрос на извлечение вышенастраивает Scalate в среде OSGi по умолчанию для загрузчика классов потока-контекста во время выполнения.Это, кажется, самый простой способ получить ссылку на загрузчик классов вызывающей стороны без необходимости явной вставки вызывающей стороне (например, объявление Spring-DM osgi:service
, экспортирующее службу шаблона, может использовать атрибут context-class-loader="service-provider"
, чтобы установить это автоматическиЭто также делает поведение Scalate OSGi во время выполнения соответствующим существующему поведению во время компиляции, которое уже использовало TCCL.
Поэтому вызывающий Scalate должен установить TCCL в свой собственный загрузчик классов или явно ввести желаемыйЗагрузчик классов в шаблонизатор, например, templateEngine.classLoader = ...
перед выполнением шаблона.
Обновление 31 августа 2012 г .: Scalate master теперь содержит все патчи, упомянутые в этом посте.
Обновление 10 апреля-2013: Scalate 1.6.1, с компиляцией шаблонов во время выполнения с помощью компилятора Scala, совместим с OSGi, а также Scala 2.10 и выше являются действительными пакетами OSGi, как выпущено.