Подтвердить что ты не робот

Scala в контейнере OSGI?

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

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

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

4b9b3361

Ответ 1

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

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

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

  • Внедрение Equinox OSGi
  • Eclipse Helios 3.6,
  • Scala 2.9

Процедура

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

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

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

  • Откорректируйте файл манифеста, требующий пакета 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"
    
  • Теперь вы можете написать активатор пучка в Scala (wooho!):

    //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){}
    }
    
  • Разверните свой проект как пакет в контейнер OSGi и обратите внимание на "Hello world from Scala!". сообщение.

Ответ 3

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

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

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

Ответ 4

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

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