【问题标题】:Scala in OSGI container?OSGI容器中的Scala?
【发布时间】: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

标签: scala osgi equinox apache-felix


【解决方案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 库包

    【讨论】:

    【解决方案4】:

    感谢大家的回答,您带领我找到了解决方案!我将在这里用更简单的术语来为更广泛的受众描述它。

    目标:在 Scala 中编写代码,部署到 OSGi。

    使用的工具:

    1. Equinox OSGi 实现
    2. Eclipse Helios 3.6,
    3. Scala 2.9

    程序

    1. 为 Eclipse 安装 Scala IDE。查找适用于 Scala 2.9 和 Eclipse 3.6 的版本
    2. 在 Eclipse 中创建新的 Scala Project
    3. 通过右键单击项目并选择:Configure -> Convert to Plug-in Projects...,将项目转换为 OSGi 包

      现在,下一部分是我卡住的地方。你看,现在我们需要将这个包(我们的项目)部署到 OSGi 环境。但是,我们缺少必须在 OSGi 容器中的 Scala 类(或包含这些类的包),以提供我们在包中使用的所有 Scala 包 API。不幸的是,找到“Scala bundle”并不是那么容易。在looking around 之后事实证明,由于某种原因,Scala 包实际上位于Sonatype Maven Repository

    4. Sonatype Maven Repository 中的适当位置下载scala-library-2.9.1.jar,并将其部署(以最适合您的方式)到您的OSGi 容器。

    5. 调整你的清单文件以要求 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"
      
    6. 现在,您可以在 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){}
      }
      
    7. 将您的项目作为捆绑包部署到 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 直接与我联系
    猜你喜欢
    • 2012-05-02
    • 1970-01-01
    • 1970-01-01
    • 2017-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    相关资源
    最近更新 更多