3

OSGi フレームワークを開始し、バンドルをインストール/開始するカスタム Main クラスを含むカスタム jar があります。このメイン jar には、プロパティ ファイルも含まれています。

目標: メイン jar のこのプロパティ ファイルのプロパティを取得する必要があるバンドル A があります。

私の最初の試みは、(Apache Felix SCR/Declarative Services を使用して) バンドル A でコンポーネントを定義し、その activate-method でプロパティを取得することでした。これはこれまでのところ機能しており、@Property-annotation で指定されたデフォルト値を取得しています。

しかし、プロパティ ファイルのプロパティをこのコンポーネントに渡すにはどうすればよいでしょうか?

OSGi アプリケーションへの引数の受け渡し では、Config Admin を使用するように言及されていますが、これを Main クラスで使用するにはどうすればよいでしょうか?

  • Config Admin はメイン jar ではなくバンドルにあり、バンドルは特定の順序でインストールされません。
  • Main クラスは、特定の service.pid はおろか、インストールするバンドルについても何も知りません。

アップデート:

@vizier によって提案されたアプローチを試しています (Config Admin を使用しないため、上記の問題はありません)。

  • メイン jar (システム バンドル) でサービス インターフェイスを定義する
  • プロパティファイルを読み取る実装を提供します(プロパティファイルは同じjarにあります)
  • このサービス インターフェイスを含むパッケージ X をエクスポートします
  • 次に、バンドル A はパッケージ X をインポートできます。たとえば、Declarative Services を使用してサービスを参照できます。

しかし、私のバンドル A では次のようになります。

org.osgi.framework.BundleException: Unresolved constraint in bundle <bundle A> [14]: Unable to resolve 14.0: missing requirement [14.0] osgi.wiring.package; (&(osgi.wiring.package=<package X>)(version>=0.1.0)(!(version>=1.0.0)))
    at org.apache.felix.framework.Felix.resolveBundleRevision(Felix.java:3826)
    at org.apache.felix.framework.Felix.startBundle(Felix.java:1868)
    at org.apache.felix.framework.Felix.setActiveStartLevel(Felix.java:1191)
    at org.apache.felix.framework.FrameworkStartLevelImpl.run(FrameworkStartLevelImpl.java:295)
    at java.lang.Thread.run(Thread.java:722)

カスタム パッケージがマニフェスト ファイルの Export-Package に追加されている場合でも、システム バンドルは osgi パッケージのみをエクスポートしますか? または何がうまくいかないのですか?

4

4 に答える 4

1

最も簡単なのは、バンドルAをホストとして、プロパティファイルを含むjarをフラグメントにすることです。

次に、プロパティはバンドルのクラスパスにあり、簡単に読み取ることができます。

于 2012-05-22T17:00:39.287 に答える
1

メイン クラスを含む jar を OSGi バンドルにすることもできます。起動時に、このバンドルを他のバンドルと一緒にインストールします。次に、次のようなさまざまな手法を使用して、他のバンドルが jar に含まれるプロパティにアクセスできるようにします。

  • プロパティにアクセスするためのクラスを提供し、モジュールの依存関係を使用して統合します (エクスポート パッケージ/インポート パッケージ)
  • プロパティにアクセスするためのサービスとして提供
  • 構成管理者を使用する
于 2012-05-22T16:26:01.317 に答える
0

Apache Karaf にも同様のケースがあります。そこでは、単にプロパティを Java システム プロパティとして設定し、それらをフレームワークにも渡します。これらは、OSGi バンドル コンテキストでプロパティとして使用できます。したがって、これはプラットフォーム全体のプロパティに適しています。karaf スターターのプロジェクトを参照してください: http://svn.apache.org/viewvc/karaf/trunk/main/

ユーザー バンドルにプロパティが必要な場合は、構成管理サービスを使用する方がはるかに優れています。これにより、プロパティを取得するメカニズムからユーザー バンドルが分離され、実行時の更新も可能になります。プロパティの構造と意味を定義できるメタタイプ サービスもあります。これにより、プロパティを編集するための優れたフォームが可能になります。

私のウェブサイトの 2 つのチュートリアルで、構成管理サービスの使用方法を説明しています。

于 2012-05-23T10:27:48.553 に答える