OSGI容器中的Scala?
我如何在Scala中编写我的包,然后将其部署到OSGI容器中?
首先将它编译成“java”,还是我可以将scala直接部署到OSGI中,并使用某种捆绑来识别它?
任何指针都会很棒。 目前我使用的是Apache Felix作为我的osgi容器,但是对通用概念的简单解释足以让我开始。
感谢大家的答案,你带我到解决scheme! 我将在这里用更简单的术语来描述它,以扩大更多的读者。
目标 :在scala中编码,部署到OSGi。
使用的工具:
- Equinox OSGi实现
- Eclipse Helios 3.6,
- 斯卡拉2.9
程序
- 安装Eclipse的Scala IDE 。 查找将与Scala 2.9和Eclipse 3.6兼容的版本
- 在Eclipse中创build新的
Scala Project
。 -
将项目转换为OSGi包,方法是右键单击它并select:
Configure -> Convert to Plug-in Projects...
现在,下一个部分是我卡住的地方。 你看,现在我们需要把这个bundle(我们的项目)部署到OSGi环境。 但是我们错过了必须在OSGi容器中的Scala类(或者包含这些类的bundle)才能提供我们在bundle中使用的所有Scala包API。 不幸的是,find“Scala包”并不那么容易。 事实certificate,出于某种原因,Scala bundle实际上位于Sonatype Maven Repository中 。
-
从Sonatype Maven资源库中的相应位置下载
scala-library-2.9.1.jar
,并将其部署到您的OSGi容器中。 -
调整你的清单文件,以要求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!)中编写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){} }
-
将您的项目作为一个捆绑包部署到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文件。