37

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

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

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

4

4 回答 4

34

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

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

使用的工具:

  1. Equinox OSGi 实现
  2. 日食太阳神 3.6,
  3. 斯卡拉 2.9

程序

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

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

  4. 从Sonatype Maven Repositoryscala-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 中编写捆绑激活器(哇哦!):

    //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!” 信息。

于 2011-09-28T14:58:07.203 回答
14

Scala模块

作者在这里的Scala days 2010快速介绍视频

于 2011-02-19T20:49:06.350 回答
8

OSGi 不关心你用什么语言编写代码:JVM 字节码只是 JVM 字节码。所以:

  • 用 Scala 编译
  • 使用 bnd 将生成的类包装在一个包中(就像从 Java 源代码编译的代码一样)。
  • 将捆绑包部署到 OSGi,就像您对“普通”捆绑包所做的那样(因为它一个普通捆绑包)。

您会注意到您的包依赖于 Scala 库。这也没什么奇怪的,就像在 Java 代码中有依赖一样。为了解决这些依赖关系,您需要从scala-lang-osgi安装 Scala 库包

于 2011-09-23T15:51:18.287 回答
5

它没有什么特别之处:用 Scala 编写代码,并通过提供必要的包元数据和服务描述符将其包装为 OSGi 包,就像使用 Java 一样。

Apache Maven可以在此过程中为您提供帮助。查看Guggla 项目(一个 Scala 脚本引擎)以获得一个工作示例。pom.xml中的maven-bundle-plugin负责生成包元数据并将其包含在最终的 jar 文件中。它指的是您需要提供的服务描述符xml 文件。

于 2011-09-21T08:09:31.173 回答