OSGI容器中的Scala?

37

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

我需要先将其编译成"java",还是可以直接部署Scala到OSGI,并使用某种bundle来识别它呢?

任何指针都会很好。目前我正在使用Apache Felix作为我的OSGI容器,但一个简单的通用概念的解释就足以让我开始了。


1
Scala可以编译成Java字节码,因此你可以使用Java实现的所有功能。Scala库在http://scala-tools.org上可以找到(至少包括scala-compiler和scala-library),它们都是OSGi bundles。如果你愿意,还可以使用ScalaModules - OSGi的Scala DSL。 - tenshi
这是一个 OSGi + Scala + ScalaModules + sbt 项目的示例:https://github.com/weiglewilczek/scalamodulesexamples - tenshi
你想在哪个工具链中展示你的例子?例如,你想使用Eclipse、Maven还是其他什么工具? - rancidfishbreath
我很想在最新的Eclipse版本(3.6或更高版本)中看到一个例子。无论是Felix还是Equinox OSGi实现都可以。 - Andriy Drozdyuk
以下项目包含Java和Scala代码,并使用bnd构建:https://github.com/paremus/examples - Neil Bartlett
谢谢Neil,这很棒。但是他在Eclipse中如何与项目一起工作呢?我担心我不理解bnd - 我正在使用Equinox容器,在那里我只需创建一个“运行配置”并开始运行。这是否意味着“scala”捆绑包应该包含在运行配置中?是否有任何特殊的Scala特定组件/服务需要在容器中? - Andriy Drozdyuk
4个回答

34
感谢大家的答案,你们帮助我找到了解决方案!我在此为更广泛的受众简单描述一下。

目标:使用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项目
  3. 右键点击项目,选择:Configure -> Convert to Plug-in Projects...将项目转换为OSGi捆绑包。

    现在,接下来的部分是我遇到问题的地方。你看,我们现在需要将此捆绑包(我们的项目)部署到OSGi环境中。然而,我们缺少必须在OSGi容器中存在的Scala类(或包含这些类的捆绑包),以提供我们在捆绑包中使用的所有Scala软件包API。不幸的是,找到“Scala捆绑包”并不那么容易。在查找后,事实证明,由于某种原因,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编写你的捆绑包激活器(哇哦!):

  7. //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){}
    }
    
  8. 将你的项目作为一个 bundle 部署到 OSGi 容器中,并留意 "Hello world from scala!" 的消息。


这是一个很好的答案,但现在已经过去3年了。我想知道你今天的答案会是什么?显然,你现在可能正在使用Scala 2.10或2.11。还在使用Equinox吗?还在使用Eclipse Helios吗? - Reid Spencer
@rspencer 今天我正在使用Akka 2.2.4 :-) 我很想尝试将OSGi与Akka结合起来,但我还没有机会在足够大的项目上工作,其中弹性/容错和适应性是优先考虑的(例如航空航天、医疗保健...)。我的初步想法是使用OSGi粗略地模块化系统,同时让每个bundle都用actors实现。哦,今天我使用IntelliJ进行基于Scala的开发(它比几年前的状态有了很大的改进) - Andriy Drozdyuk
感谢更新。看来我们最近都在使用相同的技术。我也对将Akka Actors OSGi化很感兴趣,刚刚注意到了akka osgi子项目 - Reid Spencer
确实,akka/scala的开发人员做得很好!他们发布的代码质量之高让我感到惊讶——我希望他们不会停止或对我们“Sun”。如有需要,请随时通过drozzy@gmail.com直接与我联系。 - Andriy Drozdyuk

14

ScalaModules是Scala语言的一个子集,使用不同的编译器吗?我不确定这里的DSL是什么意思... - Andriy Drozdyuk
另外我不需要一个"模块",我需要一种在OSGI中运行Scala的方法。Scala模块没有关于如何部署、安装或使用它的文档。 - Andriy Drozdyuk
是的,但这个项目是用什么制作的?是Eclipse、Netbeans还是其他什么?除非我瞎了——我找不到任何关于这个信息的参考。 - Andriy Drozdyuk
2
就像许多(大多数?)Scala项目一样,它使用Simple Build Tool - 你可以从中导出各种IDE的项目文件。 - Johan Prinsloo
好的,我制作了一个快速示例项目,使用Scalamodules - 它使用SBT和Intellij IDEA(带有scala和SBT插件):https://github.com/johanprinsloo/scalamoduleplay - Johan Prinsloo
显示剩余3条评论

8

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

  • 使用Scala进行编译
  • 使用bnd将生成的类封装在一个bundle中(就像从Java源代码编译的代码一样)。
  • 将bundle部署到OSGi中,就像部署“正常”的bundle一样(因为它是一个“正常”的bundle)。

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


谢谢Neil,但是我该如何将“scala-lang-osgi”部署到我的OSGi容器中?它不是一个“jar”捆绑包 :-( - Andriy Drozdyuk
算了,我找到了捆绑的jar包,它在这里:http://scala-tools.org/repo-releases/com/weiglewilczek/scala-lang-osgi/ - Andriy Drozdyuk

5

没什么特别的:用Scala编写代码,并像Java一样提供必要的bundle元数据和服务描述符,将其打包成OSGi bundle。 Apache Maven可以帮助您完成此过程。查看Guggla Project(Scala脚本引擎)以获取工作示例。pom.xml中的maven-bundle-plugin会在最终的jar文件中生成和包含bundle元数据。它引用您需要提供的服务描述符xml文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接