2012-03-12 49 views
9

我開發了一個Eclipse RCP應用程序,該應用程序大量使用OSGi包,它們提供服務供以後使用。用例要求捆綁包註冊他們的服務(例如導入過濾器),以便以後在不同情況下使用。 OSGi包是使用maven-bundle-plugin構建的。如何在Eclipse平臺上自動啓動/急切啓動OSGi服務

如何告訴Equinox自動啓動OSGi包?通過Activator的正常方法不起作用。只有懶惰模式正在工作,但我無法觸摸未知捆綁中的類。我讀了OSGi規範,並且沒有提供與延遲加載相反的負載。是否有另一個機會來標記自動加載的捆綁包?

在Eclipse中我有機會將自動啓動設置爲true,但是在Maven和Tycho的發佈版本中,我該怎麼做?

由於未加載org.eclipse.equinox.ds的問題,聲明式服務不起作用。我可以以某種方式啓動它而不是激活器嗎?這也是一個解決方案,但我不知道如何構建分佈或設置爲配置。

這裏有什麼最佳實踐?還有其他的可能嗎? Eclipse平臺上OSGi捆綁包的文檔有點簡單。

+1

我不知道maven/tycho。但是如果你使用pde ant腳本,它使用'config.ini'來控制自動啓動。檢查'workspace \ .metadata \ .plugins \ org.eclipse.pde.core \ your-rcp-product-name.product'下生成的'config.ini'。 – 2012-03-13 09:02:22

+1

請參閱http://software.2206966.n2.nabble.com/tycho-generated-config-ini-does-not-start-runtime-td6077893.html – 2012-03-13 09:03:45

回答

4

您的聲明式服務正處於正確的軌道上。手動註冊您的服務就像努力工作,安全地查看它們可以做更多的工作,並且很難正確地進行。在這個領域要注意的另一個標準是Blueprint,儘管如果你有DS元數據,我當然不會建議你重寫任何東西。藍圖在非常動態的環境中具有更好的特性,並且配置更豐富。 (我是Blueprint實現之一的提交者,Apache Aries)。對於Blueprint和DS而言,重要的是其他事情是爲您管理您的服務。

這讓我們回想起爲什麼你的軟件包沒有啓動的問題。我認爲他們確實從Felix開始的事實必須有線索。你是否啓動了Equinox控制檯並確認所有捆綁包已安裝並解決? ('ss'列出軟件包。) 您是否看過config.ini文件,並確認您的軟件包已列出並具有適當的啓動級別 - 或者您是否使用Equinox自動啓動 - 其他軟件包?

+0

是的,我會嘗試接下來的聲明性服務。我會稍後再說。 – 2012-03-13 19:38:30

+0

所以,它工作。我讓DS在運行時啓動,並通過XML聲明服務。之前的服務已經解決並且未開始。我怎麼能影響這個,我不知道。但DS正在工作。 – 2012-03-22 11:39:20

0

MANIFEST.MF有這樣的:

Bundle-ActivationPolicy: lazy 

這也有用:

http://wiki.eclipse.org/Lazy_Start_Bundles#Should_I_change_to_the_new_Bundle-ActivationPolicy_Header.3F

但是我要說我會嘗試依靠OSGI激活儘可能。如果沒有其他解決問題的方法,那麼以前的鏈接可能會有所幫助。

+2

對於延遲加載,我的應用程序需要了解要激活的包。這不是想要的,也不是一個好的設計。這就是爲什麼我刪除了延遲加載。在菲利克斯我的捆綁被正確激活。只是Equinox會造成一些麻煩。我需要的是'Bundle-ActivationPolicy:auto',但是這不被支持。 – 2012-03-13 07:29:47

5

您可以在插件中使用「org.eclipse.ui.startup」擴展點。這允許您指定一個在Eclipse UI啓動時將被調用的IStartup類。只要這是你的包中的一個類,那麼你的包就會啓動。

這將意味着包括一個plugin.xml文件,這將是一個Eclipse插件而不是標準的OSGi包,但是您可以使用這個插件來激活任何標準的OSGi包。

+0

我使用的一些軟件包是相當通用的,我不想讓它們使用eclipse插件。我知道,將plugin.xml和其他文件捆綁到jar中並不是問題,但我認爲它不是很乾淨。你的建議很好,我認爲它會起作用,但我認爲這是我的最後選擇。不管怎麼說,還是要謝謝你! – 2012-03-13 19:35:49

+0

我不認爲有任何需要修改您當前的捆綁包。 Eclipse插件可以簡單地成爲一個新的包,只需確保DS包已經啓動,這樣您的聲明式服務就可以找到。這避免了必須在config.ini文件中指定啓動軟件包。 – 2012-03-14 08:27:08

8

感嘆。你是Eclipse中誤導性策略的受害者,以防止(愚蠢)程序員延長啓動時間。他們沒有提出警告,而是決定不開始打包。這與OSGi推薦的相反:-(一個捆綁只能被激活(他們基本上是無效的開始),當有人從它加載類(這是什麼惰性激活是)。

到目前爲止最好的解決方案是使用聲明式服務(Declarative Services),你可以聲明即時服務,這些服務將在啓動時被激活,並且你可以聲明惰性服務,這些服務在使用時會被激活,懶惰當然是首選的(當你不是愚蠢的程序員時)需要立即,像例如,提供其服務在互聯網上的服務器你必須確保你的config.ini DS正在啓動

+0

是的,我已經閱讀了有關不同的philosphies。我喜歡並支持延遲加載,但正如您所提到的那樣:某些設計需要自動加載才能註冊服務(白板模式)。我會嘗試聲明式服務。 – 2012-03-13 19:37:53

+0

正如你所說,除非在配置中明確列出,否則Eclipse通常不會啓動任何包,或者它使用延遲激活並且有一個類由其他包加載。這是DS的問題,因爲停止/安裝捆綁包會被忽略。但是,我注意到Equinox服務組件運行時具有隱藏功能:如果您將套件聲明爲延遲加載,並且組件標記爲「立即」,則SCR將爲您啓動套件*(很可能是因爲SCR數字表明,如果沒有人開始它,沒有人會)。還沒有關於非直接行爲的想法。 – JBert 2015-09-21 19:49:58

0

您可以添加到您的.product文件:。

<configurations> 
    <plugin id="my.plugin.id" autoStart="true" startLevel="4" /> 
</configurations> 

或者,在Eclipse中打開.product文件並轉到配置選項卡,然後在該處添加具有所需啓動級別的插件。