2015-12-16 95 views
0

可以在任何一個告訴我是什麼VS進口裝箱率VS嵌入依賴性OSGi的Maven依賴VS進口裝箱率VS嵌入依賴性

依賴之間的差異

我真的失去了看樣品osgi包的pom文件。

如果默認maven <import-package>*</import-package>語句解決了對其他包的依賴性。

爲什麼需要使用<dependency>元素包含該包?

編輯:我沒有任何樣品放在這裏。 問題是「如何將一個bundle作爲一個依賴項來訪問它的包 - >不同包中的服務?」

+0

我不明白。你能更具體一點嗎?也許用一個樣本pom和你不明白的地方。 –

回答

2

Maven提供了廣泛的依賴模型。一個項目有一個pom,那個pom指定了它對其他poms的依賴關係。這是傳遞性的,所以有一個依賴可以下載一半的互聯網。在maven中,您可以指定您需要依賴於您的編譯類路徑或運行時類路徑。

在OSGi中,您應該創建一個可以在不同環境中使用的包。出於這個原因,一個bundle是一個JAR,它使得它的依賴性是明確的。就像Maven一樣,你可以讓一個bundle依賴另一個bundle(Require-Bundle)。但是,需要另一個捆綁包變得相當脆弱。

  • 也容易產生較大的依賴關係圖
  • 您可以輕鬆地在您需要在不同版本的同一工件的情況得到
  • 您需要的方式很多,因爲你往往只需要另一束
  • 的一部分
  • 你經常喜歡用不同的實現

因此OSGi的具有基於能力本地依賴模型。包出口是一種能力。在OSGi中,捆綁包A不依賴於捆綁包B,但它取決於 b。 (包應該代表一個合約/ API。)任何導出包b的包都會滿足包A.這個模型有很多優點,它的最大優點是它不是傳遞的。這爲部署時間提供了巨大的靈活性。

在OSGi中,一個關鍵目標是最小化依賴關係,並且只依賴於定義良好的API,從不實現,因此該包在許多不同的上下文中很容易使用。

那麼你如何在maven中構造它?

一般來說,你讓bnd分析你的代碼。然後,它會創建一個清單,用於精確地表達您的軟件包依賴於哪些軟件包。

但是,開源代碼中很多代碼的構造方式很可能並不僅僅依賴於API。那麼你如何處理這些實現依賴關係?

使用嵌入依賴項選項,您可以拖入maven pom中的所有傳遞依賴項(並且可以是很多),但我不會使用它。它很快但也很髒,因爲你不知道你拖入什麼。

一般來說,我會仔細設計包裹。 bnd因此可以指定包含來自構建路徑上其他工件的哪些包。甚至有一種讓BND計算是從特定的命名空間需要什麼:

Conditional-Package: aQute.lib.* 

這種情況很少完美的作品第一次,你會發現你會錯過的東西,你跑那麼這將需要一些反覆的第一次。但是,至少你知道你的包裏面有什麼。