37 Stimmen

Scala im OSGI-Container?

Wie kann ich mein Bundle in Scala kodieren und es dann in einem OSGI-Container bereitstellen?

Muss ich es in "Java" erste kompilieren oder kann ich Scala direkt in OSGI bereitstellen und verwenden Sie eine Art von Bundles, um es zu erkennen?

Jeder Hinweis wäre großartig. Derzeit verwende ich Apache Felix als mein osgi-Container, aber nur eine einfache Erklärung der allgemeinen Konzepte würde ausreichen, um mich zu starten.

34voto

Andriy Drozdyuk Punkte 53902

Danke an alle für die Antworten, ihr habt mich zur Lösung geführt! Ich werde sie hier in etwas einfacheren Worten für ein breiteres Publikum beschreiben.

Ziel : Code in Scala, Bereitstellung für OSGi.

Verwendete Werkzeuge:

  1. OSGi-Implementierung von Equinox
  2. Eclipse Helios 3.6,
  3. Scala 2.9

Verfahren

  1. Installieren Sie Scala-IDE für Eclipse. Version finden, die mit Scala 2.9 und Eclipse 3.6 funktioniert

  2. Neu erstellen Scala Project in Eclipse.

  3. Konvertieren Sie das Projekt in ein OSGi-Bundle, indem Sie es mit der rechten Maustaste anklicken und auswählen: Configure -> Convert to Plug-in Projects...

    Der nächste Teil war der, bei dem ich nicht weiterkam. Jetzt müssen wir dieses Bundle (unser Projekt) in der OSGi-Umgebung bereitstellen. Allerdings fehlen uns die Scala-Klassen (oder das Bundle, das diese Klassen enthält), die im OSGi-Container vorhanden sein müssen, um die API der Scala-Pakete bereitzustellen, die wir in unserem Bundle verwenden. Leider ist es nicht so einfach, das "Scala-Bundle" zu finden. Nach sich umschauend Es stellt sich heraus, dass sich das Scala-Bündel aus irgendeinem Grund tatsächlich in der Sonatype Maven-Repository .

  4. Herunterladen der scala-library-2.9.1.jar an der entsprechenden Stelle im Sonatype Maven-Repository und verteilen Sie es (auf die für Sie bequemste Weise) in Ihrem OSGi-Container.

  5. Passen Sie Ihre Manifestdatei so an, dass sie das Scala-Bundle erfordert ( Ich bin mir ziemlich sicher, dass dies ein Ort ist, an dem die Bundle-Abhängigkeit (d.h. Require-Bundle) eigentlich ziemlich sicher ist - schließlich werden Sie Ihren Scala-Code nie ohne Scala ausführen! ):

    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. Jetzt können Sie Ihren Bundle-Aktivator in Scala schreiben (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){}
    }
  7. Stellen Sie Ihr Projekt als Bundle im OSGi-Container bereit und achten Sie auf die "Hello world from scala!"-Meldung.

14voto

Johan Prinsloo Punkte 1188

ScalaModule

Ein kurzes Intro-Video des Autors hier Scala-Tage 2010

8voto

Neil Bartlett Punkte 23356

OSGi kümmert sich nicht darum, in welcher Sprache Sie Ihren Code schreiben: JVM Bytecode ist einfach JVM Bytecode. Also:

  • mit Scala kompilieren
  • die resultierenden Klassen mit bnd in ein Bundle verpacken (so wie Sie es bei aus Java-Quellen kompiliertem Code tun würden).
  • das Bundle für OSGi bereitstellen, genau wie bei einem "normalen" Bundle (weil es ist ein normales Bündel).

Sie werden feststellen, dass Ihr Bundle Abhängigkeiten von der Scala-Bibliothek hat. Auch das ist nichts Ungewöhnliches, es ist genau so, als hätte man Abhängigkeiten in seinem Java-Code. Damit diese Abhängigkeiten aufgelöst werden können, müssen Sie das Scala-Bibliotheks-Bundle von scala-lang-osgi

5voto

michid Punkte 9389

Das ist nichts Besonderes: Schreiben Sie Ihren Code in Scala und verpacken Sie ihn als OSGi-Bundle, indem Sie die notwendigen Bundle-Metadaten und Service-Deskriptoren bereitstellen, wie Sie es mit Java tun würden.

Apache Maven kann Ihnen dabei helfen. Werfen Sie einen Blick auf die Guggla-Projekt (eine Scala-Skript-Engine) für ein funktionierendes Beispiel. Die maven-bundle-plugin im pom.xml kümmert sich um die Erzeugung und Aufnahme der Bundle-Metadaten in die endgültige jar-Datei. Es verweist auf die Service-Deskriptor xml-Datei, die Sie zur Verfügung stellen müssen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X