Scala in OSGI container?

前端 未结 4 1356
[愿得一人]
[愿得一人] 2021-01-30 01:42

How can I code my bundle in Scala and then deploy it into OSGI container?

Do I compile it into \"java\" first or can i deploy scala straight into OSGI and use some kind

相关标签:
4条回答
  • 2021-01-30 02:09

    Thanks to everyone for the answers, you led me to the solution! I will describe it here in a little simpler terms for a wider audience.

    Goal: Code in scala, deploy to OSGi.

    Tools used:

    1. Equinox OSGi implementation
    2. Eclipse Helios 3.6,
    3. Scala 2.9

    Procedure

    1. Install Scala IDE for Eclipse. Find version that will work with Scala 2.9 and Eclipse 3.6
    2. Create new Scala Project in Eclipse.
    3. Convert the project to OSGi bundle by right clicking on it and selecting: Configure -> Convert to Plug-in Projects...

      Now, the next part was where I got stuck. You see, now we need to deploy this bundle (our project) to OSGi environment. However we are missing the Scala classes (or bundle that contains those classes) that have to be in OSGi container to provide all the Scala packages API we use in our bundle. Unfortunately finding the "Scala bundle" is not that easy. After looking around it turns out, that for some reason, Scala bundle is actually located in the Sonatype Maven Repository.

    4. Download the scala-library-2.9.1.jar from the appropriate location in the Sonatype Maven Repository, and deploy it (by means most comfortable for you) to your OSGi container.

    5. Adjust your manifest file to require the Scala bundle (I am pretty sure that this is one place where bundle dependency (i.e. Require-Bundle) is actually pretty safe - after all, you will never run your Scala code without 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. Now, you can write your bundle activator in 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){}
      }
      
    7. Deploy your project as a bundle to OSGi container and look out for the "Hello world from scala!" message.

    0 讨论(0)
  • 2021-01-30 02:14

    OSGi does not care what language you write your code in: JVM bytecode is just JVM bytecode. So:

    • compile with Scala
    • wrap the resulting classes in a bundle using bnd (just as you would for code compiled from Java sources).
    • deploy the bundle to OSGi, just as you would for a "normal" bundle (because it is a normal bundle).

    You'll notice that your bundle has dependencies on the Scala library. Again there is nothing strange about this, it's just like having dependencies in you Java code. In order for those dependencies to resolve, you need to install the Scala library bundle from scala-lang-osgi

    0 讨论(0)
  • 2021-01-30 02:16

    ScalaModules

    A quick intro video by the author here Scala days 2010

    0 讨论(0)
  • 2021-01-30 02:20

    There is nothing special to it: write your code in Scala and wrap it up as an OSGi bundle by providing the necessary bundle meta data and service descriptors as you would do with Java.

    Apache Maven can help you in the process. Have a look at the Guggla Project (a Scala script engine) for a working example. The maven-bundle-plugin in the pom.xml takes care of generating and including the bundle meta data in the final jar file. It refers to the service descriptor xml file which you need to provide.

    0 讨论(0)
提交回复
热议问题