Как заставить компилятор scala работать в среде OSGi - PullRequest
8 голосов
/ 20 января 2012

Я использую шаблонизатор Scala (Scalate) для компиляции шаблонов во время выполнения в среде OSGi (Scala 2.9.1). Шаблоны не могут быть предварительно скомпилированы, потому что они создаются динамически.

Для того, чтобы это работало, компилятор Scala должен работать в среде OSGi. Однако, поскольку компилятор Scala не может принимать загрузчик классов в качестве входных данных, это не работает «из коробки».

По моим исследованиям, существует два основных подхода к решению:

1) Плагин компилятора Scala ( здесь он запущен , но он не был затронут с 2009 года, а сообщений в списке Scala в 2009 * заявили, что он не готов производственное использование.

2) Создание виртуальной файловой системы поверх контекста пакета, которая затем может использоваться компилятором Scala. Очевидно, парни из Apache успешно использовали этот подход на более старой версии Scala.

Кто-нибудь заставил Scalate, Scala 2.9.1 и OSGi работать вместе для динамической компиляции шаблонов?

Ответы [ 2 ]

3 голосов
/ 29 января 2012

У моей команды теперь есть компиляция и выполнение 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, как выпущено.

0 голосов
/ 21 января 2012

Я думаю, вам нужно установить политику друзей. Следующее должно помочь.

http://wiki.eclipse.org/index.php/Context_Class_Loader_Enhancements#Buddy_Policy

http://www.eclipsezone.com/eclipse/forums/t90282.html

http://help.eclipse.org/indigo/topic/org.eclipse.platform.doc.isv/reference/misc/bundle_manifest.html

В вашем пакете вы можете сказать, что вам нужно использовать тот же загрузчик классов, что и в другом пакете.

...