OSGI容器中的Scala?

时间:2011-02-19 18:30:22

标签: scala osgi equinox apache-felix

如何在Scala中编写我的包,然后将其部署到OSGI容器中?

我首先将它编译成“java”还是可以直接将scala部署到OSGI中并使用某种捆绑来识别它?

任何指针都会很棒。 目前我使用Apache Felix作为我的osgi容器,但只是对通用概念的简单解释就足以让我开始。

4 个答案:

答案 0 :(得分:33)

感谢大家的回答,你引导我找到解决方案!我将在这里以更简单的术语为更广泛的受众描述它。

目标:scala中的代码,部署到OSGi。

使用的工具:

  1. Equinox OSGi实施
  2. Eclipse Helios 3.6,
  3. Scala 2.9
  4. <强>程序

    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类(或包含这些类的包),以提供我们在bundle中使用的所有Scala包API。不幸的是,找到“Scala捆绑”并不容易。在事件looking around之后,由于某种原因,Scala捆绑包实际上位于Sonatype Maven Repository

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

    5. 调整您的清单文件以要求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"
      
    6. 现在,您可以在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){}
      }
      
    7. 将项目作为捆绑包部署到OSGi容器,并注意“来自scala的Hello world!”消息。

答案 1 :(得分:14)

ScalaModules

作者在Scala days 2010

撰写的快速介绍视频

答案 2 :(得分:8)

OSGi并不关心您编写代码的语言:JVM字节码只是JVM字节码。所以:

  • 使用Scala编译
  • 使用bnd将结果类包装在一个包中(就像从Java源代码编译的代码一样)。
  • 将捆绑包部署到OSGi,就像使用“普通”捆绑包一样(因为 是普通捆绑包)。

您会注意到您的捆绑包依赖于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文件。