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 容器中的数据源

OSGi 容器 - Equinox 与 Apache Karaf 中的 Apache Felix

OSGi 容器中的骆驼:将 InterceptStrategy 应用于所有骆驼上下文

无法从 Karaf 2.2.0 OSGi 容器中的根上下文运行 WAR

为啥即使我的 maven 依赖项中有第三方依赖项,也只需要 OSGi 容器中的第三方依赖项?