2012-06-27 164 views
4

我是OSGi的新手,並且正在使用Equinox。我已經做了幾次搜索,並且無法找到答案。在OSGI - handling 3rd party JARs required by a bundle的討論有所幫助,但並沒有完全回答我的問題。OSGi bundle從非捆綁包jar包導入包:爲它們創建捆綁包?

我已經獲得了一個jar文件rabbitmq-client.jar,它已經打包爲一個OSGi包(Bundle-Name和其他MANIFEST.MF中的這些屬性),我希望將它作爲一個包進行安裝。該罐從commons-io-1.2.jar進口包裝org.apache.commons.ioorg.apache.commons.io.input。 RabbitMQ客戶端2.7.1發行版也包含commons-cli-1.1.jar,所以我認爲它也是必需的。

我檢查了這些常見罐子的清單,發現它們看起來並沒有打包成捆。也就是說,他們的清單沒有任何標準的捆綁特性。

我的具體問題是:如果我將rabbitmq-client.jar作爲捆綁安裝,訪問需要從commons jar中導入的包的正確方法是什麼?我能想到的只有三種選擇,無需重建rabbitmq-client.jar

  1. 來自commons jars的軟件包已包含在Equinox全局類路徑中,並且rabbitmq-client.jar將從那裏自動獲取它們。
  2. 我必須用兩個commons jar創建另一個bundle,導出所需的軟件包,並在Equinox中安裝該軟件包。
  3. 當我啓動Equinox時,必須將這兩個commons jar放在全局類路徑中,並且從那裏可以使用rabbitmq-client.jar

我讀過一個通常不使用OSGi容器中的全局類路徑。我不清楚全局類路徑中的項是否在構建單獨的束類路徑時可用。但是,我注意到rabbitmq-client.jar也導入了其他包,例如javax.net,我認爲它來自全局類路徑。還是有一些其他的捆綁出口呢?

感謝您的幫助!

回答

5

解決方案(2)是正確的方法。 (1)和(3)不起作用,因爲如你已經理解的那樣,在OSGi中不存在全局類路徑。

每個包都會導入所需的所有包,而這些包必須由另一個包導出。有一個例外,這是下java.*命名空間中的所有類...即沒有必要進口java.langjava.util

包如javax.net確實來自JRE的,但他們仍然不一個「全局類路徑」。有一個叫做System Bundle的特殊bundle,它代表OSGi中的OSGi框架本身。這束出口一堆包是來自JRE如javax.netjavax.swingorg.w3c.dom

+0

謝謝,@neil,這有幫助。我已經閱讀了一些OSGi教程,但沒有完全回答這些問題。我想我會在OSGi新手​​上徘徊一段時間,直到我弄明白爲止。 –

2

我也想補充一下尼爾說,流行包,喜歡的commons-io的,通常有沒有必要對於選項(2),因爲其他人已經完成了它。有一個包含許多轉換包的SpringSource存儲庫。對於commons-io,你可以做得更好,因爲maven central的'官方'jar版本1.4已經是一個捆綁包了。

+0

+1謝謝我應該提到那 –

+0

謝謝,@holly,這有幫助。我確實看過SpringSource,看到了commons-io的一個包,但不是用於commons-cli。我必須再看一遍。 –

+0

只是一個評論:'rabbitmq-client.jar'實際上不再需要'commons-cli'或'commons-io'(自2.8.0版本以來)。這些罐子在'rabbitmq'庫中提供,用於運行一些測試。 –

相關問題