Скала в OSGI контейнере? - PullRequest
37 голосов
/ 19 февраля 2011

Как я могу написать свой пакет в Scala и затем развернуть его в контейнере OSGI?

Должен ли я сначала скомпилировать его в "java" или я могу развернуть scala прямо в OSGI и использовать какие-то пакеты для его распознавания?

Любые указатели были бы великолепны. В настоящее время я использую Apache Felix в качестве своего osgi-контейнера, но для начала достаточно простого объяснения общих понятий.

Ответы [ 4 ]

33 голосов
/ 28 сентября 2011

Спасибо всем за ответы, вы привели меня к решению! Я опишу это здесь в несколько более простых терминах для более широкой аудитории.

Цель : код в Scala, развертывание в OSGi.

Используемые инструменты:

  1. Equinox OSGi реализация
  2. Eclipse Helios 3.6,
  3. Scala 2.9

Процедура

  1. Установка Scala IDE для Eclipse. Найдите версию, которая будет работать с Scala 2.9 и Eclipse 3.6
  2. Создать новый Scala Project в Eclipse.
  3. Преобразуйте проект в комплект OSGi, щелкнув по нему правой кнопкой мыши и выбрав: Configure -> Convert to Plug-in Projects...

    Теперь, следующая часть, где я застрял. Видите ли, теперь нам нужно развернуть этот пакет (наш проект) в среде OSGi. Однако нам не хватает классов Scala (или пакета, содержащего эти классы), которые должны находиться в контейнере OSGi, чтобы обеспечить API всех пакетов Scala, которые мы используем в нашем пакете. К сожалению, найти «Scala bundle» не так просто. После осмотра выясняется, что по какой-то причине комплект Scala фактически находится в репозитории Sonatype Maven .

  4. Загрузите scala-library-2.9.1.jar из соответствующего места в Sonatype Maven Repository и разверните его (наиболее удобным для вас способом) в своем контейнере OSGi.

  5. Настройте файл манифеста так, чтобы он требовал комплекта Scala ( Я совершенно уверен, что это то место, где зависимость комплекта (т.е. Require-Bundle) на самом деле довольно безопасна - в конце концов, вы никогда не запустите свой Scala-код без Scala! ):

    Manifest-Version: 1.0
    Bundle-ManifestVersion: 2
    Bundle-Name: Scala Hello
    Bundle-SymbolicName: com.test.scala.hello
    Bundle-Version: 1.0.0.qualifier
    Bundle-Vendor: drozzy
    Import-Package: org.osgi.framework;version="1.5.0"
    Bundle-Activator: com.test.scala.hello.Activator
    Require-Bundle: scala-library;bundle-version="2.9.1"
    
  6. Теперь вы можете написать свой активатор пакета в Scala (ух!):

    //Activator.scala
    package com.test.scala.hello
    import java.lang.System
    import org.osgi.framework.BundleActivator
    import org.osgi.framework.BundleContext
    
    class Activator extends BundleActivator {
      def start(context: BundleContext) {
          System.out.println("Hello world from scala!");
      }
      def stop(context: BundleContext){}
    }
    
  7. Разверните ваш проект в виде пакета для контейнера OSGi и найдите «Hello world from scala!» сообщение.

14 голосов
/ 19 февраля 2011

ScalaModules

Краткое вступительное видео автора здесь Scala days 2010

8 голосов
/ 23 сентября 2011

OSGi не волнует, на каком языке вы пишете свой код: байт-код JVM - это просто байт-код JVM. Итак:

  • скомпилировать с Scala
  • оберните результирующие классы в пакет, используя bnd (так же, как и для кода, скомпилированного из источников Java).
  • разверните комплект в OSGi, так же, как и для "нормального" комплекта (потому что - это нормальный комплект).

Вы заметите, что ваш пакет имеет зависимости от библиотеки Scala. Опять же, в этом нет ничего странного, это похоже на наличие зависимостей в вашем Java-коде. Чтобы устранить эти зависимости, вам необходимо установить пакет библиотеки Scala из scala-lang-osgi

5 голосов
/ 21 сентября 2011

В этом нет ничего особенного: напишите свой код в Scala и оберните его как пакет OSGi, предоставив необходимые метаданные пакета и дескрипторы служб, как это было бы с Java.

Apache Maven может помочь вам в этом процессе. Посмотрите на Guggla Project (движок скриптов Scala) для рабочего примера. maven-bundle-plugin в pom.xml заботится о генерации и включении метаданных пакета в окончательный файл JAR. Он ссылается на файл дескриптор службы xml, который вам нужно предоставить.

...