2

アクティベーターを呼び出さずに別のバンドルからパッケージをインポートすることは可能ですか? このパッケージは、バンドルの初期化を必要としません。これが悪い設計であることは理解していますが、変更することはできません。

例外:

org.osgi.framework.BundleException: The activator my-package.Activator for bundle my-bundle is invalid
at org.eclipse.osgi.framework.internal.core.AbstractBundle.loadBundleActivator(AbstractBundle.java:157)  
at org.eclipse.osgi.framework.internal.core.BundleContextImpl.start(BundleContextImpl.java:750)  
at org.eclipse.osgi.framework.internal.core.BundleHost.startWorker(BundleHost.java:352)  
at org.eclipse.osgi.framework.internal.core.AbstractBundle.resume(AbstractBundle.java:370)  
at org.eclipse.osgi.framework.internal.core.Framework.resumeBundle(Framework.java:1068)  
at org.eclipse.osgi.framework.internal.core.StartLevelManager.resumeBundles(StartLevelManager.java:557)  
at org.eclipse.osgi.framework.internal.core.StartLevelManager.incFWSL(StartLevelManager.java:464)
at org.eclipse.osgi.framework.internal.core.StartLevelManager.doSetStartLevel(StartLevelManager.java:248)  
at org.eclipse.osgi.framework.internal.core.StartLevelManager.dispatchEvent(StartLevelManager.java:445)  
at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:220)  
at org.eclipse.osgi.framework.eventmgr.EventManager$EventThread.run(EventManager.java:330)
4

3 に答える 3

7

はい、可能です。OSGi仕様で許可されており、悪い習慣でもありません。

私があなたを正しく理解しているかどうか見てみましょう。マニフェストでパッケージをエクスポートするバンドルAと、それをインポートするバンドルBがあります。バンドルAを開始せずにやりたいですよね?

はい、これは可能です。バンドルAの唯一の目的が、ライブラリなどのJavaクラスとパッケージを提供することである場合、アクティベータがない場合もあります。OSGi仕様によれば、バンドルのエクスポートされたすべてのパッケージは、バンドルが解決された状態になった直後に他のバンドルで使用できます(つまり、バンドルがインストールされ、依存関係が解決されますが、まだ開始されていません)。

バンドルAを使用するバンドルBの状態は関係ありません。バンドルBがインポートされたパッケージのクラスを使用するかどうかも関係ありません。また、特別なことをする必要はありません。通常のOSGiの方法で依存関係を宣言するだけです。

バンドルAマニフェスト:エクスポート-パッケージ:com.acme.aaa

バンドルBマニフェスト:インポート-パッケージ:com.acme.aaa

バンドルAをインストールし、それがRESOLVED状態になったかどうか、つまり、その依存関係がシステムで満たされているかどうかを確認する必要があります。はいの場合は、このままにして、バンドルBで使用できます。

上記の人々はおそらく、パッケージのインポートとOSGiでのSERVICEの使用を混同しています。サービス(つまり、「ライブ」Javaオブジェクト)を提供するには、バンドルを開始し、そのアクティベーターを呼び出す必要があります。パッケージをエクスポートするだけでは不十分です。

于 2012-07-18T09:39:49.327 に答える
0

バンドルが解決済みの状態にある場合は、そのパッケージをインポートできますが、開始されていません (まだ?)。

したがって、バンドルをインストールするだけで、開始しないでください。それが良いアイデアかどうかは文脈次第だと思います。

于 2012-07-18T09:11:37.717 に答える
0

OSGi 仕様によると、これは不可能です。唯一のオプションは、熱心なアクティブ化と遅延アクティブ化です。どちらも、バンドルからクラスを観察する前に発生しています。

ところで、クラスを参照せずにパッケージをインポートするだけの場合、遅延アクティブ化されたバンドルはアクティブ化されません。しかし、これはあなたの場合ではないと思います。

于 2012-07-18T09:08:17.000 に答える