2013-03-17 118 views
0

我想知道什麼是組織我的包的好方法,以便可以在它們之間共享作爲服務參數所需的類。OSGi服務類依賴關係

我有一對夫婦的這暴露類類型的服務接口,這將需要bundes之間進行引用,例如:

public interface DoesThis { 
    public CustomClassB doSomething(CustomClassA customClassA); 
} 

從我的理解CustomClassA(如果在同一個包作爲公開的服務定義)不會可用於其他捆綁包,那麼最好在包中導出捆綁包之間的類引用,然後將其導出?

就像一個子問題:服務和包裹出口是否應該攜手合作......從我正在閱讀的文檔中不清楚如果是這樣的話?

謝謝

+0

你能解決你的代碼示例,以清楚你要問什麼嗎?這不是有效的Java。 – 2013-03-17 11:52:43

+0

@尼爾巴特利特修正! – JLove 2013-03-17 11:55:58

回答

1

基本上是的。接口引用的所有類型必須位於導出的包中。有幾個選項:

  • 他們可能是在同一個包的接口,在這種情況下,他們自然會在同一時間作爲接口出口,因爲在OSGi中,我們總是導出/導入整個包。
  • 它們可能位於不同的包中,但可以通過與服務接口相同的包導出。
  • 它們可能位於不同的包中,並由不同的包導出。在這種情況下,服務接口包必須導入該包。

如果你仔細想一想,那麼這種類型不能導出。例如,如果消費者無法創建類型爲CustomClassA的對象來傳入,或者如果它無法理解返回類型CustomClassB,那麼消費者如何調用doSomething方法?

關於你的子問題......是的,包出口主要是爲了支持服務註冊表而存在。只有服務提供者和消費者可以就服務的「合同」達成一致,服務才能起作用,用Java來表示它們加載相同的接口。

+0

感謝您的回答......我認爲這是我的預期。就像後續一樣,爲了引用另一個bundle中的服務,我會在我的bundle上創建一個編譯時依賴項(我使用Maven)來暴露服務? (即如果它在另一個包中,我該如何引用該服務類?)。我明白上下文將允許我掌握具體的實現,但是我需要參考Interface/Service來編譯我的第二個包。再次感謝 – JLove 2013-03-17 12:20:44

+1

不,您導入包含*界面*的軟件包。整個服務點是將你從特定的實現類中分離出來,所以你只依賴於接口。爲了獲得服務對象,使用聲明式服務最簡單。例如,嘗試[Bndtools教程](http://bndtools.org/tutorial.html) – 2013-03-17 12:29:18

+0

再次感謝......我瞭解接口概念,我努力尋找解決構建時間依賴性的方法, m使用的Netbeans似乎沒有像OSGi那樣成熟。我在Netbeans中發現的唯一方法是添加一個項目依賴項,我假設這將允許我引用整個項目中的任何類,而不是應該發生的事情(如果Netbeans是OSGi意識到的)。因爲我必須使用Netbeans作爲企業策略的一部分,所以必須這樣做! – JLove 2013-03-17 15:05:46