37

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

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

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

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 ProjectEclipse で新規作成します。
  3. プロジェクトを右クリックして次を選択し、プロジェクトを OSGi バンドルに変換します。Configure -> Convert to Plug-in Projects...

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

  4. Sonatype Maven Repositoryscala-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 で記述できます (すごい!):

    //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 from scala!" に注意してください。メッセージ。

于 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 でコードを記述し、Java で行う場合と同様に、必要なバンドル メタデータとサービス記述子を提供することにより、OSGi バンドルとしてラップします。

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

于 2011-09-21T08:09:31.173 に答える