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);
}
私の質問は次のとおりです。私は何を間違っていますか? コンシューマーが拡張バンドルの登録済みサービスを検出できないのはなぜですか? それとも、フレームワークが禁止していることをしているだけなのかもしれません...この場合、拡張バンドルからサービスを提供することは不可能ですか? 拡張バンドル内のコードを操作するにはどうすればよいですか (つまり、拡張バンドル自体内の何かにアクセスできますか)?
ここでいくつかのメモ:
- OSGi の実装として felix を使用しています。
- 「ExtensionBundleExample」と「BundleExample」の両方が、felix の自動処理フォルダー内にロードされます (デフォルトは「bundle」ですが、
config.properties
「corebundles」フォルダーを使用するように調整しました。 - 出力には、「start extension bundle activator!」と正しく表示されます。しかし、 の参照を表示するときは
actualBundleExample
、出力に「null」が表示されます。 - BundleExample のオプションのカーディナリティは、目的をテストするために使用されます。コンシューマー コンポーネントが持つ「acivator」メソッドを呼び出したかっただけです (
System.out.println
コンソールを表示するために; - 私の前の質問から、拡張バンドルは OSGi フレームワーク内のニッチであることは理解していますが、それでも理解したいと思っています。このトピックに関するインターネット上の例の欠如は非常に厄介です。
返信ありがとうございます。