我该如何用Scala编写我的bundle,然后将其部署到OSGI容器中?
我需要先将其编译成"java",还是可以直接部署Scala到OSGI,并使用某种bundle来识别它呢?
任何指针都会很好。目前我正在使用Apache Felix作为我的OSGI容器,但一个简单的通用概念的解释就足以让我开始了。
我该如何用Scala编写我的bundle,然后将其部署到OSGI容器中?
我需要先将其编译成"java",还是可以直接部署Scala到OSGI,并使用某种bundle来识别它呢?
任何指针都会很好。目前我正在使用Apache Felix作为我的OSGI容器,但一个简单的通用概念的解释就足以让我开始了。
目标:使用scala编写代码并部署到OSGi。
工具:
步骤
Scala项目
。右键点击项目,选择:Configure -> Convert to Plug-in Projects...
将项目转换为OSGi捆绑包。
现在,接下来的部分是我遇到问题的地方。你看,我们现在需要将此捆绑包(我们的项目)部署到OSGi环境中。然而,我们缺少必须在OSGi容器中存在的Scala类(或包含这些类的捆绑包),以提供我们在捆绑包中使用的所有Scala软件包API。不幸的是,找到“Scala捆绑包”并不那么容易。在查找后,事实证明,由于某种原因,Scala捆绑包实际上位于Sonatype Maven Repository中。
从Sonatype Maven Repository的适当位置下载scala-library-2.9.1.jar
,并通过您最喜欢的方式将其部署到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编写你的捆绑包激活器(哇哦!):
//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){}
}
将你的项目作为一个 bundle 部署到 OSGi 容器中,并留意 "Hello world from scala!" 的消息。
作者在此处提供了一个快速介绍视频 Scala days 2010
OSGi不关心您用哪种语言编写代码:JVM字节码只是JVM字节码。所以:
您会注意到,您的bundle依赖于Scala库。同样,这并不奇怪,就像在Java代码中有依赖项一样。为了解决这些依赖关系,您需要从scala-lang-osgi安装Scala库bundle。
没什么特别的:用Scala编写代码,并像Java一样提供必要的bundle元数据和服务描述符,将其打包成OSGi bundle。 Apache Maven可以帮助您完成此过程。查看Guggla Project(Scala脚本引擎)以获取工作示例。pom.xml中的maven-bundle-plugin会在最终的jar文件中生成和包含bundle元数据。它引用您需要提供的服务描述符xml文件。