如何在 Scala 中编写我的包,然后将其部署到 OSGI 容器中?
我是先将它编译成“java”还是我可以将scala直接部署到OSGI中并使用某种包来识别它?
任何指针都会很棒。目前我使用 Apache Felix 作为我的 osgi-container,但是对通用概念的简单解释就足以让我开始。
如何在 Scala 中编写我的包,然后将其部署到 OSGI 容器中?
我是先将它编译成“java”还是我可以将scala直接部署到OSGI中并使用某种包来识别它?
任何指针都会很棒。目前我使用 Apache Felix 作为我的 osgi-container,但是对通用概念的简单解释就足以让我开始。
感谢大家的回答,您让我找到了解决方案!我将在这里用更简单的术语来描述它,以供更广泛的受众使用。
目标:Scala 中的代码,部署到 OSGi。
使用的工具:
程序
Scala Project
在 Eclipse 中新建。通过右键单击项目并选择将项目转换为 OSGi 包:Configure -> Convert to Plug-in Projects...
现在,下一部分是我卡住的地方。你看,现在我们需要将这个包(我们的项目)部署到 OSGi 环境。但是,我们缺少必须在 OSGi 容器中的 Scala 类(或包含这些类的包),以提供我们在包中使用的所有 Scala 包 API。不幸的是,找到“Scala bundle”并不是那么容易。环顾四周后发现,出于某种原因,Scala bundle 实际上位于Sonatype Maven Repository中。
从Sonatype Maven Repositoryscala-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){}
}
将您的项目作为捆绑包部署到 OSGi 容器并注意“来自 scala 的 Hello world!” 信息。
作者在这里的Scala days 2010快速介绍视频
OSGi 不关心你用什么语言编写代码:JVM 字节码只是 JVM 字节码。所以:
您会注意到您的包依赖于 Scala 库。这也没什么奇怪的,就像在 Java 代码中有依赖一样。为了解决这些依赖关系,您需要从scala-lang-osgi安装 Scala 库包
它没有什么特别之处:用 Scala 编写代码,并通过提供必要的包元数据和服务描述符将其包装为 OSGi 包,就像使用 Java 一样。
Apache Maven可以在此过程中为您提供帮助。查看Guggla 项目(一个 Scala 脚本引擎)以获得一个工作示例。pom.xml中的maven-bundle-plugin负责生成包元数据并将其包含在最终的 jar 文件中。它指的是您需要提供的服务描述符xml 文件。