OSGI容器中的Scala?

我如何在Scala中编写我的包,然后将其部署到OSGI容器中?

首先将它编译成“java”,还是我可以将scala直接部署到OSGI中,并使用某种捆绑来识别它?

任何指针都会很棒。 目前我使用的是Apache Felix作为我的osgi容器,但是对通用概念的简单解释足以让我开始。

感谢大家的答案,你带我到解决scheme! 我将在这里用更简单的术语来描述它,以扩大更多的读者。

目标 :在scala中编码,部署到OSGi。

使用的工具:

  1. Equinox OSGi实现
  2. Eclipse Helios 3.6,
  3. 斯卡拉2.9

程序

  1. 安装Eclipse的Scala IDE 。 查找将与Scala 2.9和Eclipse 3.6兼容的版本
  2. 在Eclipse中创build新的Scala Project
  3. 将项目转换为OSGi包,方法是右键单击它并select: Configure -> Convert to Plug-in Projects...

    现在,下一个部分是我卡住的地方。 你看,现在我们需要把这个bundle(我们的项目)部署到OSGi环境。 但是我们错过了必须在OSGi容器中的Scala类(或者包含这些类的bundle)才能提供我们在bundle中使用的所有Scala包API。 不幸的是,find“Scala包”并不那么容易。 事实certificate,出于某种原因,Scala bundle实际上位于Sonatype Maven Repository中 。

  4. 从Sonatype Maven资源库中的相应位置下载scala-library-2.9.1.jar ,并将其部署到您的OSGi容器中。

  5. 调整你的清单文件,以要求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(wooho!)中编写bundle激活器:

     //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容器中,并寻找“scala的Hello world!” 信息。

ScalaModules

作者在这里快速介绍video斯卡拉日2010年

OSGi不关心你用什么语言编写代码:JVM字节码就是JVM字节码。 所以:

  • 用Scala编译
  • 使用bnd将所得到的类包装在一个包中(就像从Java源代码编译的代码一样)。
  • 像OSGi一样,将软件包部署到“普通”软件包(因为它普通软件包)。

你会注意到你的包依赖于Scala库。 再一次没有什么奇怪的,就像在你的Java代码中有依赖关系一样。 为了解决这些依赖关系,您需要从scala-lang-osgi安装Scala库软件包

没有什么特别的地方:在Scala中编写代码,并像Java一样提供必要的bundle元数据和服务描述符,将其作为OSGi包进行包装。

Apache Maven可以在这个过程中帮助你。 看一个Guggla项目 (一个Scala脚本引擎)作为一个工作的例子。 pom.xml中的maven-bundle-plugin负责在最终的jar文件中生成和包含bundle元数据。 它指的是您需要提供的服务描述符 xml文件。