如何在Scala中编写我的包,然后将其部署到OSGI容器中?
我首先将它编译成“java”还是可以直接将scala部署到OSGI中并使用某种捆绑来识别它?
任何指针都会很棒。 目前我使用Apache Felix作为我的osgi容器,但只是对通用概念的简单解释就足以让我开始。
答案 0 :(得分:33)
感谢大家的回答,你引导我找到解决方案!我将在这里以更简单的术语为更广泛的受众描述它。
目标:scala中的代码,部署到OSGi。
使用的工具:
<强>程序强>
Scala Project
。右键单击项目并选择:Configure -> Convert to Plug-in Projects...
现在,下一部分是我被困的地方。您看,现在我们需要将此捆绑包(我们的项目)部署到OSGi环境。但是,我们缺少必须在OSGi容器中的Scala类(或包含这些类的包),以提供我们在bundle中使用的所有Scala包API。不幸的是,找到“Scala捆绑”并不容易。在事件looking around之后,由于某种原因,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中编写捆绑激活器(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){}
}
将项目作为捆绑包部署到OSGi容器,并注意“来自scala的Hello world!”消息。
答案 1 :(得分:14)
答案 2 :(得分:8)
OSGi并不关心您编写代码的语言:JVM字节码只是JVM字节码。所以:
您会注意到您的捆绑包依赖于Scala库。再一次,这没什么奇怪的,就像在你的Java代码中有依赖关系一样。为了解决这些依赖关系,您需要从scala-lang-osgi
安装Scala库包答案 3 :(得分:5)
没有什么特别之处:在Scala中编写代码并将其包装为OSGi包,方法是提供必要的包元数据和服务描述符,就像使用Java一样。
Apache Maven可以帮助您完成此过程。查看Guggla Project(Scala脚本引擎)以获取工作示例。 maven-bundle-plugin中的pom.xml负责生成并包含最终jar文件中的包元数据。它指的是您需要提供的service descriptor xml文件。