OSGI容器中的Scala?
Posted
技术标签:
【中文标题】OSGI容器中的Scala?【英文标题】:Scala in OSGI container? 【发布时间】:2011-06-30 11:26:48 【问题描述】:如何在 Scala 中编写我的包,然后将其部署到 OSGI 容器中?
我是先将它编译成“java”,还是可以直接将 scala 部署到 OSGI 中并使用某种包来识别它?
任何指针都会很棒。 目前我使用 Apache Felix 作为我的 osgi-container,但对通用概念的简单解释就足以让我开始。
【问题讨论】:
scala 编译为 java 字节码,因此您可以使用 java 制作的所有内容也适用于 scala。 scala-tools.org 的 Scala 库(至少 scala-compiler 和 scala-library)是 osgi 包。如果你愿意,你也可以使用ScalaModules - 用于 OSGi 的 scala DSL。 这里是 OSGi + Scala + ScalaModules + sbt 项目示例:github.com/weiglewilczek/scalamodulesexamples 您希望您的示例使用什么工具链?例如,您想使用 Eclipse、Maven 还是其他? 我希望在(最近的)Eclipse 版本(3.6 或更高版本)中看到一个示例。无论是 OSGi 实现 - Felix 还是 Equinox。 以下项目混合了Java和Scala代码,使用bnd构建:github.com/paremus/examples 【参考方案1】:ScalaModules
作者在这里Scala days 2010的快速介绍视频
【讨论】:
很好的答案,ScalaModules 比纯 Java 中可用的任何东西好几倍。另一个好视频在这里:skillsmatter.com/podcast/ajax-ria/scala-modules 那么 ScalaModules 是具有不同编译器的 Scala 语言的子集吗?我不确定 DSL 在这里是什么意思... 我也不需要“模块”,我需要一些在 OSGI 中运行 scala 的方法。 Scala 模块没有关于如何部署、安装或使用它的文档。 有一个配套示例项目:github.com/weiglewilczek/scalamodulesexamples - 其余的是标准 OSGi 部署。 像许多(大多数?)Scala 项目一样,它使用Simple Build Tool - 您可以从中为各种 IDE 导出项目文件。【参考方案2】:它没有什么特别之处:用 Scala 编写代码,并通过提供必要的包元数据和服务描述符将其包装为 OSGi 包,就像使用 Java 一样。
Apache Maven 可以在此过程中为您提供帮助。查看Guggla Project(一个Scala 脚本引擎)的工作示例。 pom.xml 中的 maven-bundle-plugin 负责生成捆绑元数据并将其包含在最终的 jar 文件中。指您需要提供的service descriptorxml文件。
【讨论】:
【参考方案3】:OSGi 不在乎你用什么语言编写代码:JVM 字节码只是 JVM 字节码。所以:
用 Scala 编译 使用 bnd 将生成的类包装在一个包中(就像从 Java 源代码编译的代码一样)。 将捆绑包部署到 OSGi,就像部署“普通”捆绑包一样(因为它是普通捆绑包)。您会注意到您的包依赖于 Scala 库。这也没什么奇怪的,就像在你的 Java 代码中有依赖一样。为了解决这些依赖关系,您需要从 scala-lang-osgi 安装 Scala 库包
【讨论】:
谢谢 Neil,但如何将“scala-lang-osgi”部署到我的 OSGi 容器?它不是一个“jar”包:-( 没关系,我找到了 bundle jar,就在这里:scala-tools.org/repo-releases/com/weiglewilczek/scala-lang-osgi【参考方案4】:感谢大家的回答,您带领我找到了解决方案!我将在这里用更简单的术语来为更广泛的受众描述它。
目标:在 Scala 中编写代码,部署到 OSGi。
使用的工具:
-
Equinox OSGi 实现
Eclipse Helios 3.6,
Scala 2.9
程序
-
为 Eclipse 安装 Scala IDE。查找适用于 Scala 2.9 和 Eclipse 3.6 的版本
在 Eclipse 中创建新的
Scala Project
。
通过右键单击项目并选择:Configure -> Convert to Plug-in Projects...
,将项目转换为 OSGi 包
现在,下一部分是我卡住的地方。你看,现在我们需要将这个包(我们的项目)部署到 OSGi 环境。但是,我们缺少必须在 OSGi 容器中的 Scala 类(或包含这些类的包),以提供我们在包中使用的所有 Scala 包 API。不幸的是,找到“Scala bundle”并不是那么容易。在looking around 之后事实证明,由于某种原因,Scala 包实际上位于Sonatype Maven Repository。
从Sonatype Maven Repository 中的适当位置下载scala-library-2.9.1.jar
,并将其部署(以最适合您的方式)到您的OSGi 容器。
调整你的清单文件以要求 Scala 包(我很确定这是一个包依赖关系(即 Require-Bundle)实际上非常安全的地方 - 毕竟,你永远不会运行你的 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!”消息。
【讨论】:
这是一个很好的答案,但现在也 3 岁了。我想知道你今天的答案是什么?显然,您现在可能使用的是 Scala 2.10 或 2.11。还在春分?还在使用 Eclipse Helios? @rspencer 今天我正在使用 Akka 2.2.4 :-) 我很想尝试将 OSGi 与 Akka 结合起来——但我还没有运气在一个足够大的项目上工作/容错和适应性是一个优先事项(即航空航天、医疗保健......)。我最初的直觉是使用 OSGi 粗略地模块化系统,同时让每个捆绑包都由参与者实现。 哦,今天我使用 IntelliJ 进行基于 Scala 的开发(它比几年前的状态有了很大的改进)。 感谢您的更新。似乎我们现在正在使用相同的技术。我也对 OSGifying akka actor 很感兴趣,并且刚刚注意到 akka osgi subproject。 确实,akka/scala 的人做得很好!我对他们发布的代码质量如此之高感到惊讶——我希望他们不要停止或对我们“晒太阳”。请随时通过 drozzy@gmail.com 直接与我联系以上是关于OSGI容器中的Scala?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 bndtools 通过 Scala 创建 OSGi 包?
OSGi 容器 - Equinox 与 Apache Karaf 中的 Apache Felix
OSGi 容器中的骆驼:将 InterceptStrategy 应用于所有骆驼上下文