web-dev-qa-db-ja.com

Scala OSGIコンテナ内?

バンドルをScalaでコーディングしてから、OSGIコンテナーにデプロイするにはどうすればよいですか?

最初にそれを「Java」にコンパイルしますか、それともscalaをOSGIに直接デプロイし、何らかのバンドルを使用してそれを認識することができますか?

どんなポインタも素晴らしいでしょう。現在、osgiコンテナとしてApache Felixを使用していますが、一般的な概念を簡単に説明するだけで開始できます。

37
Andriy Drozdyuk

答えてくれたみんなに感謝します、あなたは私を解決策に導きました!ここでは、より多くの読者のために、もう少し簡単な言葉で説明します。

Goal:scalaでコードを記述し、OSGiにデプロイします。

使用したツール:

  1. EquinoxOSGiの実装
  2. Eclipse Helios 3.6、
  3. Scala 2.9

手順

  1. インストール Scala IDE Eclipse用。 Scala 2.9およびEclipse3.6で動作するバージョンを見つける
  2. Eclipseで新しいScala Projectを作成します。
  3. プロジェクトを右クリックして次を選択し、プロジェクトをOSGiバンドルに変換します。Configure -> Convert to Plug-in Projects...

    さて、次の部分は私が行き詰まったところです。ご覧のとおり、このバンドル(プロジェクト)をOSGi環境にデプロイする必要があります。ただし、使用するすべてのScalaパッケージAPIを提供するためにOSGiコンテナーに含まれている必要があるScalaクラス(またはそれらのクラスを含むバンドル))がありません。残念ながら、「Scalaバンドル」を見つけるのはそれほど簡単ではありません。 見回す 後、何らかの理由でScalaバンドルは実際には Sonatype Mavenリポジトリ

  4. Sonatype Mavenリポジトリ の適切な場所からscala-library-2.9.1.jarをダウンロードし、OSGiコンテナーに(最も快適な方法で)デプロイします。

  5. マニフェストファイルを調整して、Scalaバンドル()が必要になるようにします。これは、バンドルの依存関係(つまり、Require-Bundle)が実際にかなり安全な場所の1つであると確信しています。すべて、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コンテナーにデプロイし、「Hello world fromscala!」を探します。メッセージ。

34
Andriy Drozdyuk

ScalaModules

著者による簡単な紹介ビデオはこちら Scala days 201

14
Johan Prinsloo

OSGiは、コードをどの言語で記述してもかまいません。JVMバイトコードは単なるJVMバイトコードです。そう:

  • scalaでコンパイルする
  • 結果のクラスをbndを使用してバンドルにラップします(Javaソースからコンパイルされたコードの場合と同じように)。
  • 「通常の」バンドルの場合と同じように、バンドルをOSGiにデプロイします(通常のバンドルであるため)。

バンドルがScalaライブラリに依存していることに気付くでしょう。これについても奇妙なことは何もありません。これは、Javaコードに依存しているのと同じです。これらの依存関係を解決するには、Scalaライブラリバンドルを scala-lang-osgi からインストールする必要があります。

8
Neil Bartlett

特別なことは何もありません。コードをScalaで記述し、Javaの場合と同じように、必要なバンドルメタデータとサービス記述子を提供してOSGiバンドルとしてラップします。

Apache Maven プロセスを支援できます。実用的な例については、 Guggla Project (a Scalaスクリプトエンジン))をご覧ください。 maven-bundle-plugin の- pom.xml は、バンドルメタデータの生成と最終的なjarファイルへの組み込みを処理します。これは、提供する必要のある サービス記述子 xmlファイルを参照します。

5
michid