2012-07-11 48 views
2

我想根據OSGi規範開發多模塊應用程序。假設我的一個模塊使用Apache Commons Logging 1.1.1。 Spring在其存儲庫中提供了一個Apache Commons Logging 1.1.1的捆綁版本,所以我可以在我的POM中添加相應的依賴項。使用OSGi的依賴管理

如果我安裝我的Apache Felix例如捆綁,是不是正確的,直到我安裝的Apache Commons Logging 1.1.1捆綁,以及依賴於Apache Commons Logging 1.1.1不會得到解決?我的包會嘗試導入尚未導出的包。

我不太瞭解依賴關係管理在OSGi世界中的工作方式。我應該安裝我的應用程序需要的每個包嗎?另外,我不明白它如何與Maven集成?

預先感謝您的解釋


編輯:我見過有阿帕奇菲利克斯稱爲OBR一個子項目,它似乎助長捆綁管理(例如部署)。但是,我們已經有了一個包含本地存儲庫,私有存儲庫的Maven體系結構...... OBR如何與Maven集成?

回答

7

如果你想和maven一起使用OSGi,那麼我推薦Apache Karaf作爲可以使用Felix OSGi框架的服務器。好處是你可以使用mvn:url直接從maven倉庫安裝bundle。

如果你只是使用Apache Karaf的maven回購,那麼你在運行時沒有傳遞解決方案。你必須安裝你需要的所有軟件包。卡拉夫具有特徵的概念有什麼幫助。因此,您可以將這些功能用作粗粒構建塊。您還可以在引用其他功能和捆綁的情況下創建自己的功能。這允許使用一個命令安裝整個應用程序。

菲利克斯和卡拉夫也支持OBR,但你必須創建自己的OBR回購。目前沒有公開的OBR回購。 OBR的優點是它可以解決大部分的傳遞依賴。 Karaf功能甚至可以與OBR一起使用,因此您可以在該功能中列出一些頂級捆綁包,並讓OBR解決其餘問題。

在實踐中,我有很好的經驗,沒有OBR的簡單卡拉夫功能。這是一些手動工作,但比你想象的要少,工作得很好。

2

OSGi依賴關係基於Java包:當一個包聲明它需要導入一個給定的包(表明一系列可接受的版本)時,框架將嘗試將該導入「導線」到合適的版本該軟件包必須由另一個軟件包導出。

如果找不到軟件包,軟件包將無法解析並且無法啓動 - 因此,您需要安裝您的應用程序需要的所有軟件包,並且Christian表示有各種工具可以幫助您接着就,隨即。

獲取所需包的一種簡單方法是使用maven-dependencies-plugin從Maven的依賴關係列表中獲取包並將它們複製到應用程序可以在啓動時找到它們以安裝它們的地方, 2](在launcher/pom.xml中),我寫的一個小例子應用程序。

你也可以使用Sling的maven-launchpad-plugin [3]生成一個嵌入OSGi框架和你需要的所有bundle的可運行jar文件,並在啓動時設置所有的東西。

關於導入和導出 - 沒有深入細節,假設您使用maven-bundle-plugin [1]來構建捆綁包,您將指定要導出哪些包(其他包將不可見其他包),maven-bundle-plugin將生成(大多數情況下是自動的,但你可以根據需要重寫)要導入的包的列表,所以如果你自己的代碼在包你想要導出和內部實現包。

[1] http://felix.apache.org/site/apache-felix-maven-bundle-plugin-bnd.html

[2] https://github.com/bdelacretaz/OSGi-for-mere-mortals

[3] http://sling.apache.org/site/maven-launchpad-plugin.html