OSGI容器中的Scala?

And*_*yuk 37 osgi scala equinox apache-felix

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

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

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

And*_*yuk 34

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

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

使用的工具:

  1. Equinox OSGi实现
  2. Eclipse Helios 3.6,
  3. 斯卡拉2.9

程序

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

    现在,下一部分是我被卡住的地方.您看,现在我们需要将此捆绑包(我们的项目)部署到OSGi环境.但是,我们缺少必须在OSGi容器中的Scala类(或包含这些类的包),以提供我们在bundle中使用的所有Scala包API.不幸的是,找到"Scala捆绑"并不容易.在环顾四周之后,事实证明,由于某种原因,Scala bundle实际上位于Sonatype Maven Repository中.

  4. scala-library-2.9.1.jarSonatype Maven存储库中的适当位置下载,并将其(通过最舒适的方式)部署到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"
    
    Run Code Online (Sandbox Code Playgroud)
  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){}
    }
    
    Run Code Online (Sandbox Code Playgroud)
  7. 将项目作为捆绑包部署到OSGi容器,并注意"来自scala的Hello world!" 信息.


Joh*_*loo 14

ScalaModules

作者在Scala 2010天的快速介绍视频

  • 像许多(大多数?)Scala项目一样,它使用[Simple Build Tool](http://code.google.com/p/simple-build-tool/) - 您可以从中导出各种IDE的项目文件. (2认同)

Nei*_*ett 8

OSGi不关心你编写代码的语言:JVM字节码只是JVM字节码.所以:

  • 用Scala编译
  • 使用bnd将结果类包装在一个包中(就像从Java源代码编译的代码一样).
  • 将bundle部署到OSGi,就像使用"普通"bundle一样(因为它普通的bundle).

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


mic*_*hid 5

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

Apache Maven可以在此过程中为您提供帮助.看看Guggla项目(Scala脚本引擎)的工作示例.的行家束-插件pom.xml中需要生成并包括在最终的jar文件中包元数据的服务.它指的是您需要提供的服务描述符 xml文件.