2016-10-14 10 views
0

私はOSGiフレームワーク拡張バンドルを十分に理解するためにこれを使用しています。 OSGi R6仕様(3.15 and 4.2.4.1)を見て、私はExtensionBundleActivatorの "start"メソッドを正常に呼び出しました。今はそのようなアクティベータの中にサービスを登録しようとしています。しかし、そのようなサービスを消費しようとすると、参照アノテーションがサービスに接続できません。OSGi拡張バンドル内のサービスの登録

ここに私のコード( 'バンドルの名前を変更しましたが、それは問題ないはずVE)です:

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の実装としてフェリックスを使用しています。出力はcorretly「スタートを示し
  2. ;
  3. 「ExtensionBundleExample」と「BundleExample」どちらがフェリックスの自動プロセスのフォルダ内にロードされます(デフォルト1は「バンドル」ですが、私は「corebundles」フォルダを使用するようにconfig.propertiesを微調整しました拡張バンドルアクティベータ! "と表示されますが、actualBundleExampleの参照を表示するときに出力は" null "と表示されます
  4. BundleExampleのオプションのカーディナリティがテスト目的に使用されています:" acivator "メソッドを消費者コンポーネント(System.out.printlnコンソールを見るために;
  5. 私の前からquestion私は拡張バンドルがニックであることを理解しています彼はOSGiフレームワークの中にいましたが、私はそれらにもかかわらず理解したいと思います。私は、このトピックに関するインターネット上の例があまりにも厄介であることを発見しました。

返信いただきありがとうございます!

答えて

2

拡張バンドルの主な目的は、フレームワーク拡張用であり、絶対に通常の使用ではありません。私。拡張バンドルはしばしばフレームワークにしっかりと結合されています。その理由は、フェンスの「間違った」側にあるため、多くのルールは拡張バンドルに含まれないからです。非常に良い理由の例はほとんどありません。ほとんどのOSGiルールが適用されないため、実際に何をしているのか分からない限り、それらを使用しないでください。

と言われています。私の期待は、BundleExampleで使用するパッケージが、拡張バンドル(クラスパスから来る)といくつかのバンドルでエクスポートされたDSの例で異なることです。それらは異なるクラスローダーから来ているので、OSGiはそれらを使用しようとしたときにクラスローダー例外が発生するため、異なるサービスと見なします。

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

まあまあです。

+0

Felix config.propertiesの "org.osgi.framework.system.packages.extra"エントリに "com.massimobono.bundleexample"を追加すると、この問題が解決されました。本当にありがとう! (私は、フレームワークにデプロイされたバンドルから「com.massimobono.bundleexample」を提供するバンドルを含めないようにする必要もありましたが...) – Koldar

関連する問題