私は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);
}
私の質問は:私は何間違っている?コンシューマが拡張バンドルの登録済みサービスを検出できないのはなぜですか?あるいは、フレームワークが禁止する何かをしているだけかもしれません...この場合、拡張バンドルからサービスを提供することは不可能ですか?拡張バンドル内のコードと対話するにはどうしたらいいですか?
ここではいくつかの注意事項:
- 私はOSGiの実装としてフェリックスを使用しています。出力はcorretly「スタートを示し
- ;
- 「ExtensionBundleExample」と「BundleExample」どちらがフェリックスの自動プロセスのフォルダ内にロードされます(デフォルト1は「バンドル」ですが、私は「corebundles」フォルダを使用するように
config.properties
を微調整しました拡張バンドルアクティベータ! "と表示されますが、actualBundleExample
の参照を表示するときに出力は" null "と表示されます - BundleExampleのオプションのカーディナリティがテスト目的に使用されています:" acivator "メソッドを消費者コンポーネント(
System.out.println
コンソールを見るために; - 私の前からquestion私は拡張バンドルがニックであることを理解しています彼はOSGiフレームワークの中にいましたが、私はそれらにもかかわらず理解したいと思います。私は、このトピックに関するインターネット上の例があまりにも厄介であることを発見しました。
返信いただきありがとうございます!
Felix config.propertiesの "org.osgi.framework.system.packages.extra"エントリに "com.massimobono.bundleexample"を追加すると、この問題が解決されました。本当にありがとう! (私は、フレームワークにデプロイされたバンドルから「com.massimobono.bundleexample」を提供するバンドルを含めないようにする必要もありましたが...) – Koldar