私はこれ(OSGI)で本当に初めてで、簡単な例をやろうとしています。私は怠惰な行動を働かせることができません。このような問題を解決するブループリント実装がいくつかあることは知っていますが、その実装に進む前に、いくつかの基本を学んでおくとよいと思いました。
バンドル データサービス: マニフェスト バージョン: 1.0 バンドル バージョン: 1.0.0 バンドル名: DataService バンドル マニフェスト バージョン: 2 バンドル アクティベーター: DataService.Activator インポート パッケージ: org.osgi.framework Bundle-SymbolicName: DataService エクスポート パッケージ: DataService;version="1.0.0" Bundle-ActivationPolicy: レイジー バンドル DataServiceClient: マニフェスト バージョン: 1.0 バンドル バージョン: 1.0.0 バンドル名: DataServiceClient バンドル マニフェスト バージョン: 2 バンドル アクティベーター: DataServiceClient.Activator Import-Package: org.osgi.framework, DataService;version="[1.0.0,1.0.0]" Bundle-SymbolicName: DataServiceClient
OK、コードを変更しましたが、まだうまくいきません。
外部アプリケーション、バンドルのインストール、フレームワークの開始、および DataServiceClient バンドルのみの開始。どのバンドル クラスにもアクセスできません。
File bundleDir = new File("./bundles/"); String[] bundleResources = bundleDir.list(); for(String bundleResourcePath : bundleResources) { File bundleResource = new File(bundleDir, bundleResourcePath); InputStream bs = new FileInputStream(bundleResource); mFramework.getBundleContext().installBundle(bundleResource.getName(), bs); } mFramework.start(); bl = mFramework.getBundleContext().getBundles(); for(バンドル b : bl) { if (b.getBundleId() != 0 && b.getSymbolicName().contains("DataServiceClient")) { b.start(); } }
これが DataServiceClient の開始です。
System.out.println("DataServiceClient 開始"); IDataService サービス = new DummyService(); System.out.println(service.getData());
「DataService」バンドルの DummyService クラスは次のとおりです。
public class DummyService は IDataService を実装します { @オーバーライド public String getData() { 「DummyService データ」を返します。 } }
「DataService」バンドルの開始は次のとおりです。
System.out.println("DataService 開始");
私が得ている出力:
DataServiceClient 開始 ダミーサービス データ
ただし、次のことを期待しています。
DataServiceClient 開始 DataService 開始 ダミーサービス データ
http://www.osgi.org/Design/LazyStartから少し引用
レイジーアクティベーション
レイジー アクティベーションは、バンドルからクラスをロードする要求が最初に成功したときに、バンドルをアクティベートする必要があるライフ サイクル ポリシーです。
ただし、機能しないため、遅延アクティベーションの概念を完全に誤解しているか、何か間違っていると思います。
DataService バンドルの開始を明示的に呼び出さない限り、DataService バンドルの Activator.start を呼び出さないようです。これは私がatmを取得していないものです。
お時間ありがとうございました