2012-11-22 36 views

回答

13

在OSGi容器運行時,它什麼都不做。事實上,它甚至沒有在OSGi規範中提到過(我檢查過R4)。

但是,它可以在構建時由bnd使用的.bnd文件中指定。如果是這樣,它可以用來確定進入捆綁包的內容。 當bnd構建一個包時,它會自動確定哪些類需要進入包中。包含所有導出的包中的類都包含在內,並且它們所依賴的所有類(傳遞式)也包含在內。這意味着如果一個類似乎沒有被使用,那麼它將不會被包含在該包中。但是,您可以使用Private-Package指令告訴bnd將軟件包的內容包含在軟件包中,即使它看起來未被使用。如果未指定Private-Package指令,則它將由bnd自動生成。

Private-Package的文檔的內容如下:

私人包

夾雜物的方法是相同的導出-Package頭,唯一的區別是,是,這些包不出口。這個頭文件將被複制到清單中。如果通過noth選擇了一個包,則導出優先。

私營包= COM。*

3

其實私募套餐並不僅僅是沒有導出包的更多。如果Private-Package中指定的包沒有在您自己的項目中定義並且沒有導入到Import-Package中,那麼它們會自動內聯到您的jar中。所以這是包含非OSGi依賴關係的簡單方法。請小心,但內聯很容易導致類路徑問題。

11

如果你知道什麼靜態鏈接然後你明白私人包裝。否則繼續閱讀。

Private-Package是bnd的方式,告訴你必須在jar中但不導出的包。它是而不是一個OSGi頭,但一個bnd'指令'。

該指令定義了必須包含在JAR中的類路徑中的包(帶有通配符)。 bnd是獨一無二的,它從規範中填充JAR,而不是像大多數構建工具那樣的目錄。原因是,除非模塊是「設計好的」,並仔細考慮了它們的佈局,否則它們很少提供模塊化的優勢。

通常,Private-Package指定包含不應與其他包(即實現類)共享的類的包。儘管通常它們來自bnd所用的相應項目,但在類路徑中從任何其他JAR獲取它們是完全可以接受的。

一個用例是一個帶有utils的庫。在一個bundle中轉換一個util庫通常會對依賴造成嚴重破壞,因爲utils往往依賴於很多不相關的東西;你使用一種微小的方法,突然你拖入30Mb的依賴關係。 bnd本身在aQute.lib *包中大量使用此模型,因此不應該導出此庫中的包。這是一個捆綁規模和'下載互聯網'之間的交易。Eclipse和Apache Felix的世界之間可以區別。 Apache Felix捆綁包通常是獨立的,不需要各種支持和util捆綁包,而Eclipse的捆綁包往往需要大量的管道捆綁包。我認爲這種差異很大程度上是由Eclipse的PDE引起的,它使得包含其他項目的軟件包成爲不可能,除非您複製源代碼當然是一個很大的禁忌。

在C世界裏他們有一種叫做靜態鏈接的東西。鏈接程序後,任何未解決的問題將從庫中檢索並添加到目標中。在一定程度上私人包裝是相同的想法。實際上有一個頭條件包,它靜態地鏈接指定的包和它們傳遞依賴的任何東西(只要它們落入模式中)。

最後,bnd顯示未在清單中的Private-Package標頭中導出的擴展包。畢竟,清單應該描述的內容...

如果您是作者,您可以刪除與-removeheaders頭:與< _removeheaders私人封裝(或行家>私營包

+0

請問爲什麼BND不「私人包裝」所有的非出口類?如果你的項目中有一個類,那是因爲你需要它;所以如果它沒有出口,它不應該是私人的。的話,你什麼時候不需要導出包或者私有包 - 一個包? – Hilikus

+1

你必須指定私有包,因爲bnd並不假定所有來自src目錄的類都應該包含在內,所以沒有範圍允許減少導出軟件包。bnd的類路徑上的任何軟件包都可以包含在軟件包中遺棄或出口。這樣,bnd可以從一個單獨的項目中構建多個bundle,這與大多數構建環境不同。它還允許導出包提供的API包,即使它們來自另一個包/ jar。 –