OSGI容器中的Scala?

OSGI容器中的Scala?,scala,osgi,equinox,apache-felix,Scala,Osgi,Equinox,Apache Felix,如何在Scala中编写包,然后将其部署到OSGI容器中 我是先将其编译成“java”还是直接将scala部署到OSGI中,并使用某种捆绑包来识别它 任何指点都很好。 目前我正在使用ApacheFelix作为我的osgi容器,但只要简单解释一下通用概念就足以让我开始使用它。 作者在这里的一段简短介绍视频没有什么特别之处:用Scala编写代码,并像Java一样提供必要的捆绑元数据和服务描述符,将其打包为OSGi捆绑包 我可以在这个过程中帮助你。请看一看(Scala脚本引擎)的工作示例。中的负责在最终

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

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

任何指点都很好。 目前我正在使用ApacheFelix作为我的osgi容器,但只要简单解释一下通用概念就足以让我开始使用它。


作者在这里的一段简短介绍视频

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


我可以在这个过程中帮助你。请看一看(Scala脚本引擎)的工作示例。中的负责在最终jar文件中生成并包含捆绑元数据。它指的是您需要提供的xml文件。

OSGi不关心您用什么语言编写代码:JVM字节码就是JVM字节码。因此:

  • 用Scala编译
  • 使用bnd将生成的类打包成一个包(就像从Java源代码编译的代码一样)
  • 将捆绑包部署到OSGi,就像部署“普通”捆绑包一样(因为它是普通捆绑包)
您会注意到您的包依赖于Scala库。这也没什么奇怪的,就像Java代码中有依赖项一样。为了解决这些依赖关系,您需要从安装Scala库捆绑包。感谢大家的回答,您引导我找到了解决方案!我将在这里用更简单的术语来描述它,以吸引更多的读者

目标:在scala中编码,部署到OSGi

使用的工具:

  • Equinox OSGi实现
  • 日食太阳神3.6
  • Scala 2.9
  • 程序

  • 为Eclipse安装。查找将与Scala 2.9和Eclipse3.6一起使用的版本
  • 在Eclipse中创建新的Scala项目
  • 通过右键单击项目并选择:
    Configure->Convert to Plug-in Projects…

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

  • 从中的适当位置下载
    scala-library-2.9.1.jar
    ,并将其部署到您的OSGi容器中

  • 调整清单文件以需要Scala捆绑包(我非常确定这是一个捆绑包依赖项(即require bundle)实际上非常安全的地方——毕竟,没有Scala,您永远不会运行Scala代码!):

  • 现在,您可以在Scala中编写bundle activator了(wooho!):

  • 将您的项目作为捆绑包部署到OSGi容器中,并注意“HelloWorldfromScala!”消息


  • scala编译成java字节码,因此您可以用java制作的所有东西也适用于scala。至少Scala库(至少Scala编译器和Scala库)是osgi包。如果您愿意,您也可以将-scala DSL用于OSGi?例如,您想使用Eclipse、Maven或其他什么吗?我希望在(最近的)Eclipse版本(3.6或更高版本)中看到一个示例。无论OSGi实现是Felix还是Equinox,下面的项目混合了Java和Scala代码,并且是用bnd构建的:很好的答案,ScalaModules比纯Java中可用的任何东西都好几倍。这里还有一个很好的视频:ScalaModules是Scala语言的一个子集吗?我不知道DSL在这里意味着什么……而且我不需要“模块”,我需要一些在OSGI中运行scala的方法。Scala模块没有关于如何部署、安装或使用它的文档。有一个附带的示例项目:-其余的是标准OSGi部署。与许多(大多数?)Scala项目一样,它使用-可以从中导出各种IDE的项目文件。谢谢Neil,但是我如何将“Scala lang OSGi”部署到我的OSGi容器中?它不是一个“罐子”包:-(没关系,我找到了这个罐子包,它在这里:这是一个很好的答案,但现在已经3岁了。我想知道你今天的答案是什么?很明显,你现在可能在Scala 2.10或2.11上。仍然在Equinox?仍然在使用Eclipse Helios?@rspencer今天我在使用Akka 2.2.4:-)我很想尝试将OSGi与Akka结合起来,但我还没有幸参与到一个足够大的项目中,在这个项目中,恢复力/容错性和适应性是一个优先事项(即航空航天、医疗保健……)。我最初的直觉是使用OSGi粗略地对系统进行模块化,同时让每个包都由参与者实现。哦,今天我使用IntelliJ进行基于Scala的开发(与几年前相比有了很大的改进)。感谢您的更新。现在我们似乎在使用同样的技术。我也对akka的演员很感兴趣,我刚刚注意到了akka/scala的演员们做得很好!我对他们发布的代码质量如此之高感到惊讶——我希望他们不要停下来或对我们“晒太阳”。请随时通过直接与我联系drozzy@gmail.com
    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"
    
    //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){}
    }