0

OSGi フレームワーク拡張バンドルを完全に理解するために遊んでいます。OSGi R6 仕様 ( 3.15 および 4.2.4.1 ) を見た後、ExtensionBundleActivator. 今、そのようなアクティベーター内にサービスを登録しようとしています。ただし、そのようなサービスを利用しようとすると、参照アノテーションがサービスの接続に失敗します。

これが私のコードです(バンドルの名前を変更しましたが、問題にはなりません):

public class ExtensionBundleActivator implements BundleActivator {

    @Override
    public void start(BundleContext context) throws Exception {
        System.out.println("start extension bundle activator!");

        context.registerService(
            BundleExample.class.getName(),
            new BundleExampleImpl(),
            new Hashtable<>(new HashMap<>()));
    }

    @Override
    public void stop(BundleContext context) throws Exception {
        //service automatically unregistered
    }

}

そして、ここにそのような拡張バンドルのマニフェストがあります:

Manifest-Version: 1.0
Bnd-LastModified: 1476436248622
Build-Jdk: 1.8.0_91
Built-By: massi
Bundle-ClassPath: .
Bundle-ManifestVersion: 2
Bundle-Name: extensionbundleexample
Bundle-SymbolicName: com.massimobono.microsi.extensionbundleexample
Bundle-Version: 0.0.1.SNAPSHOT
Conditional-Package: com.massimobono.microsi.common.*;
Created-By: Apache Maven Bundle Plugin
ExtensionBundle-Activator: com.massimobono.microsi.bundleexample.imp
 l.ExtensionBundleActivator
Fragment-Host: system.bundle; extension:=framework
Provide-Capability: osgi.service;objectClass:List<String>="com.massimobo
 no.microsi.bundleexample.BundleExample"
Require-Capability: osgi.ee;filter:="(&(osgi.ee=JavaSE)(version=1.8))"
Service-Component: OSGI-INF/com.massimobono.microsi.bundleexample.im
 pl.ExtensionBundleExample.xml
Tool: Bnd-3.0.0.201509101326

消費するバンドル (バンドルの一部):

@Reference(cardinality=ReferenceCardinality.OPTIONAL)
public BundleExample actualBundleExample;

@Activate
public void activate() {
    System.out.println("activating " + this.getClass().getSimpleName() + "with actual bundle set to "+ this.actualBundleExample);
}

私の質問は次のとおりです。私は何を間違っていますか? コンシューマーが拡張バンドルの登録済みサービスを検出できないのはなぜですか? それとも、フレームワークが禁止していることをしているだけなのかもしれません...この場合、拡張バンドルからサービスを提供することは不可能ですか? 拡張バンドル内のコードを操作するにはどうすればよいですか (つまり、拡張バンドル自体内の何かにアクセスできますか)?

ここでいくつかのメモ:

  1. OSGi の実装として felix を使用しています。
  2. 「ExtensionBundleExample」と「BundleExample」の両方が、felix の自動処理フォルダー内にロードされます (デフォルトは「bundle」ですが、config.properties「corebundles」フォルダーを使用するように調整しました。
  3. 出力には、「start extension bundle activator!」と正しく表示されます。しかし、 の参照を表示するときはactualBundleExample、出力に「null」が表示されます。
  4. BundleExample のオプションのカーディナリティは、目的をテストするために使用されます。コンシューマー コンポーネントが持つ「acivator」メソッドを呼び出したかっただけです (System.out.printlnコンソールを表示するために;
  5. 私の前の質問から、拡張バンドルは OSGi フレームワーク内のニッチであることは理解していますが、それでも理解したいと思っています。このトピックに関するインターネット上の例の欠如は非常に厄介です。

返信ありがとうございます。

4

1 に答える 1

2

拡張バンドルの主な目的は、フレームワークの拡張のためであり、通常の使用のためではありません。つまり、拡張バンドルは多くの場合、フレームワークに緊密に結合されています。その理由は、フェンスの「間違った」側にあるため、多くのルールが拡張バンドルにカウントされないためです。非常に正当な理由から、例はほとんどありません。OSGi 規則のほとんどは適用されないため、自分が何をしているのかをよく理解していない限り、それらを使用しないでください。

それは言った。私の予想では、BundleExample に使用するパッケージは、拡張バンドル (クラス パスから取得) と、バンドルによってエクスポートされた DS サンプルとの間で異なります。これらは異なるクラス・ローダーに由来するため、OSGi はそれらを異なるサービスと見なします。これを使用しようとするとクラス・ローダー例外が発生するためです。

フレームワークにこのパッケージをエクスポートさせることで、これを解決できます。

推測です。

于 2016-10-14T10:15:13.737 に答える