2012-07-13 79 views
1

我正在使用maven(maven-bundle-plugin)和apache karaf在osgi bundle開發中邁出第一步。 我的問題是:我如何導入另一個包的包?使用maven bundle插件進行osgi開發並設置依賴關係

如果我有兩個捆綁包A和B. 可以說捆綁包A導出一個包「package.from.bundle.A」。 這我可以捆綁項目的pom.xml聲明:

... 
<instructions> 
... 
    <Export-Package> 
    package.from.bundle.A*;version=${project.version} 
    </Export-Package> 
    <Import-Package> 
     * 
    </Import-Package> 
</instructions> 
... 

但我怎麼能聲明,我想使用包捆B? 如果我只是寫項目B的POM文件的進口包裝標籤之間的軟件包名,這也不行......

... 
<instructions> 
... 
    <Export-Package> 
    </Export-Package> 
    <Import-Package> 
     package.from.bundle.A 
    </Import-Package> 
</instructions> 
... 

如何行家從哪個包項目這個包是關係到知道嗎?我如何使用maven在我的bundle之間使用依賴關係?

謝謝

回答

1

Maven的捆綁插件使用BND的封面,它使用字節碼分析,從編譯後的代碼追溯制定出進口之下。軟件包導出更多的是設計,這就是爲什麼需要明確指定。

您可以查看目標文件夾中生成的清單,我建議您確保您瞭解您正在執行的操作。

+0

是的,但問題是,當我想要構建我的包(使用mvn安裝)時,我最終得到一個構建失敗說:未分解的引用[org.osgi.framework]由Bundle-類路徑。在配置包中找到錯誤。當我參考上面的標籤中顯示的package「package.from.bundle.A」時,會發生這種情況,這對我來說似乎合乎邏輯,因爲maven怎麼知道在哪裏找到這個包?我想我做的是完全錯誤的...... – Moonlit 2012-07-14 08:09:26

+0

你沒有提到你的原始問題中的構建失敗。 :) 你肯定不需要元素,因爲它默認爲*,它會導入你的包使用的所有包。清單在編譯後生成,所以如果你有編譯錯誤,那麼這與你的配置中的內容有關。 聽起來好像你需要依賴org.osgi.core來解決編譯問題。 – 2012-07-14 12:13:39

+0

thanx的回覆,我看了看,org.osgi.core依賴關係存在...但我想我找到了錯誤。是否真的有必要爲另一個bundle設置maven dependency ...因此,如果bundle A依賴於bundle B,我還必須向bundle A的maven項目聲明一個Maven依賴項(在B的pom.xml中)?如果我這樣做,我不會在我做maven安裝時遇到錯誤。 – Moonlit 2012-07-14 12:51:03

1

您必須將maven依賴關係設置爲您需要的所有包。這對於maven中的編譯步驟是必需的。然後,封面下的maven bundle插件或bnd將分析構建結果。它會自動檢測您提供的所有軟件包並將其導出,除非它們中包含一些名稱,如impl。它還會檢測您導入的所有包,併爲它們創建Import-Package語句。所以在大多數情況下,您不必配置導入和導出。所以把它們留空並在罐子裏檢查Manifest。只有當它不正確時,你必須手動配置。如果你配置額外的進口不要忘記添加,*。如果您忘記了這一點,那麼自動檢測到的軟件包不會被添加,您必須手動指定您通常不需要的軟件包。