2015-11-13 62 views
1

我有一個OSGi包,它聲明瞭org.osgi.service.subsystem包上的可選依賴項。它偵聽使用DS添加新的子系統實例。但是,即使依賴項不可用,此DS組件也會激活。只有可選的依賴項可用時才激活OSGi組件

如果可選依賴項可用,是否有方法僅激活此DS組件?

基本上,此DS組件執行的處理僅在運行時存在實際子系統時才相關。如果沒有,並且該類在運行時中不可用,則此組件應保持休眠狀態。

+2

如果您不想激活組件,除非存在依賴關係,爲什麼它是可選的依賴項?這聽起來像一個強制性的依賴。 –

+0

也許你應該把你的bundle分成幾個bundle,這樣依賴不必是可選的了。在我看來,當有人想要指定一個可選的依賴項時,現在是重構的時候了。 –

+0

@BJHargrave從概念上講,它是一個可選的依賴項,因爲如果bundle不存在,bundle可以很好地運行,但是如果存在的話需要額外的處理。 – ekj

回答

1

據我所知這是不可能的。如果綁定解析後可用包變得可用,則捆綁包將不會自動綁定到可選包。你將不得不明確地刷新這個包。

因此,在這種情況下更好的解決方案是將組件移動到對子系統包具有強制依賴關係的單獨包中。然後它可以與子系統支持一起安裝。

+0

好的謝謝。那麼可選依賴關係的重點是什麼?我真的不想讓這個包的用戶必須安裝單獨的部分。我想我應該可以使用ServiceTracker進行此操作。我發現DS不支持這個相對簡單的用例有點奇怪。 – ekj

+0

基本上可選的依賴關係允許你做你的計劃,但它們使用起來非常棘手。例如,您不能直接從可選的依賴項訪問這些類,因爲它會使依賴項成爲必需的。所以一個ServiceTracker可以工作,但你需要一些魔力。 Apache CXF做這樣的事情,但它很醜陋。 請參閱https://github.com/apache/cxf/blob/master/core/src/main/java/org/apache/cxf/bus/osgi/CXFActivator.java#L75-L90和https:// github。 COM /阿帕奇/ CXF /斑點/主/核心/ SRC /主/ JAVA /組織/阿帕奇/ CXF /總線/藍圖/ NamespaceHandlerRegisterer.java –