開發 OSGi 應用程式
您可以利用 org.apache.aries.blueprint 套件中的類別來延伸 OSGi 應用程式設計模型;這個協力廠商 SPI 是透過 blueprint-1.0 伺服器特性來提供。 您必須存取 OSGi 應用程式軟體組來套用您的延伸。 在 Liberty 中,OSGi 應用程式會當作子系統來執行。如果要尋找 OSGi 應用程式,您可以在使用者特性中建立一個 ServiceTracker。
關於這項作業
這個主題說明使用者特性的開發人員如何尋找執行中的 OSGi 應用程式。 提供 OSGi 應用程式之程式設計模型延伸的使用者特性通常需要這個作業。 比方說,新的使用者特性可能會實作新的軟體組延伸器(通常稱為儲存器),或更簡單地,追蹤和呼叫從某些 OSGi 應用程式內發佈的服務,來提供這類延伸。
這類使用者特性必須利用特定的執行中 OSGi 應用程式的 BundleContext 來建立新的 BundleTracker 和 ServiceTracker 實例。 這個 BundleContext 可以從與 OSGi 應用程式相關聯的 org.osgi.service.subsystem.Subsystem 中取得。 下列程序說明如何取得 SubSystem 服務。
程序
如果要在使用者特性中建立 ServiceTracker 來尋找 OSGi 應用程式,請完成下列步驟:
- 建構以您想要尋找的 Subsystem 為目標的 org.osgi.framework.Filter。
- 建立一個 org.osgi.util.tracker.ServiceTracker,利用步驟 1 的 Filter 來取得與您想要尋找的 OSGi 應用程式相關聯的 org.osgi.service.subsystem.Subsystem 服務。 這個 Subsystem 服務實例提供使用 OSGi 應用程式所需要的一切項目。
範例
下列範例顯示如何利用使用者特性中的 ServiceTracker,以符號名稱 my.app 來尋找應用程式:
import org.osgi.framework.BundleContext;
import org.osgi.service.subsystem.Subsystem;
import org.osgi.util.tracker.ServiceTracker;
import org.osgi.util.tracker.ServiceTrackerCustomizer;
在下列程式碼摘錄中,ctx 變數是使用者特性其中一個軟體組的 BundleCoNtext:
String SERVICE_FILTER = "(&(objectClass=org.osgi.service.subsystem.Subsystem)
(subsystem.type=osgi.subsystem.application)(subsystem.symbolicName=my.app))"
org.osgi.framework.Filter filter = ctx.createFilter(SERVICE_FILTER);
最後一個 'null' 參數可以更換為實作 ServiceTrackerCustomizer<Subsystem, Subsystem> 的類別實例:
org.osgi.util.tracker.ServiceTracker<Subsystem, Subsystem> str = new ServiceTracker<Subsystem, Subsystem>(ctx, filter, null);
SERVICE_FILTER 可以建構成使用如下常數:
org.osgi.framework.Constants.OBJECTCLASS;
org.osgi.service.subsystem.SubsystemConstants.SUBSYSTEM_SYMBOLICNAME_PROPERTY;
org.osgi.service.subsystem.SubsystemConstants.SUBSYSTEM_TYPE_APPLICATION;
org.osgi.service.subsystem.SubsystemConstants.SUBSYSTEM_TYPE_PROPERTY;