2013-10-31 52 views
3

目的嵌入OSGi框架:什麼時候應該完成捆綁解析?

我目前適配現有的Java應用程序,通過把它變成一個基於插件的系統。這是一個基於Spring MVC的Web服務,它提供各種服務。我打算讓這些服務可插拔,由OSGi捆綁提供。我已經有所有提供這些服務的OSGi捆綁軟件,這些服務由maven-bundle-plugin創建。

我做了什麼

我決定嵌入一個OSGi框架(Apache的菲利克斯)到使用OSGi R4 API我的應用程序,可以將其作爲一個Maven依賴性:

<dependency> 
    <groupId>org.apache.felix</groupId> 
    <artifactId>org.apache.felix.framework</artifactId> 
    <version>4.2.1</version> 
</dependency> 

初始化它:

FrameworkFactory frameworkFactory = ServiceLoader 
    .load(FrameworkFactory.class).iterator().next(); 
Map<String, String> config = new HashMap<String, String>(); 
config.put(FelixConstants.LOG_LEVEL_PROP, Integer.toString(Logger.LOG_DEBUG)); 
this.framework = frameworkFactory.newFramework(config); 
this.framework.init(); 
this.context = framework.getBundleContext(); // keep ref to context 

安裝通過上下文中的所有包:

context.installBundle(jarPath) 

和啓動框架:

framework.start(); 

我然後檢查所有包的狀態和所有的除了框架具有INSTALLED狀態。該框架包是ACTIVE

很明顯,安裝的捆綁包沒有解決。

問題

當菲利克斯想嘗試解決包?從我從OSGi生命週期中瞭解到的情況來看,解決方案會自動發生。但我不知道費利克斯是否試圖解決捆綁。即使我將日誌級別配置爲DEBUG,它也不會打印任何日誌。如果我能看出爲什麼某個軟件包無法解析(即Felix能告訴我哪些軟件包丟失了?),那麼調試我的設置就很容易了。

回答

2

Felix的行爲是正確的,因爲您還沒有啓動任何捆綁軟件。如果您不啓動它們,則無需解決它們,因此它們將保持在INSTALLED狀態。

爲了讓您的應用程序實際執行任何操作,您需要啓動軟件包。您應該在之後執行此操作您已經安裝了所有的軟件包...也就是說,您應該在啓動任意軟件包之前安裝所有軟件包。最簡單的方法是將由installBundle()返回的Bundle對象累積到列表中,然後在此列表上執行第二個循環,調用Bundle.start()

0

想到的第一件事就是開始水平。我無法從我在這裏看到什麼是你的捆綁包的開始級別,但這可能是你需要研究的東西。

至於你的問題,OSGI規範(版本4.3,這是我現在得心應手)在部分描述了這一點。4.4.2捆綁狀態。如果您的軟件包尚未啓動(通過啓動級別或手動啓動),它們將處於已安裝狀態。

如果您安裝了Felix gogo shell並檢查包的起始級別以及是否滿足所有要求,可能會有所幫助。希望有所幫助。

編輯︰原來我錯了,刪除了這一行:「我相信菲利克斯會自動嘗試解決捆綁安裝期間,但我沒有什麼可以支持現在。

+0

不,Felix在安裝時不會自動解析捆綁包。事實上,它絕對不會違反規範,並會破壞OSGi中的許多東西。 –

+0

另外,啓動級別在這裏並不重要,因爲沒有捆綁包啓動。開始級別不會導致數據包奇蹟般地啓動,它只是控制啓動指令生效的順序。 –

+0

你說得對,尼爾。感謝您的更正。關於開始級別,捆綁開始級別是否低於系統級別會導致框架啓動相關捆綁包? – ilikeorangutans

相關問題