是否可以在OSGi應用程序中使用非osgi庫?在osgi應用程序中使用非osgi庫
例如,我正在開發一個基於語義的搜索引擎,並且我正在使用第三方自然語言處理庫(http://wiki.opencog.org/w/RelEx_Dependency_Relationship_Extractor)。
是否有可能將這種不支持OSGi的庫作爲幾個jar文件與我的OSGi應用程序進行接口連接?
是否可以在OSGi應用程序中使用非osgi庫?在osgi應用程序中使用非osgi庫
例如,我正在開發一個基於語義的搜索引擎,並且我正在使用第三方自然語言處理庫(http://wiki.opencog.org/w/RelEx_Dependency_Relationship_Extractor)。
是否有可能將這種不支持OSGi的庫作爲幾個jar文件與我的OSGi應用程序進行接口連接?
由於這是寫在以前的答案,你有兩個選擇,如果你想在你的包使用額外的庫:
的第一種方法是簡單,因爲你只需要庫JAR(以及所有依賴的)複製到包(如到根目錄),然後將它們MANIFEST.MF
添加到Bundle-Classpath
元素(見here) 。但是,在做這件事的時候,你必須記住,這個添加的庫只能在它被嵌入的包中看到(所以庫重用是有限的)。您始終可以將此庫中的軟件包添加到MANIFEST.MF
中的Export-package
元素中,以使其可用於其他軟件包,但這遠非優雅的解決方案(但它可行)。
爲了使其他軟件包可見,您應該使用第二種方法,即從庫中創建一個OSGi包(在Eclipse中也有一些工具可以幫助您做到這一點)。但是,對於更復雜的庫,這種方法可能更難(因爲OSGi中依賴和特定的類加載方法)。
因此,如果你只想在一個包中使用庫,我建議使用第一種方法(它更容易實現)。如果你想在應用程序的許多包中使用這個庫,你應該考慮第二種方法。
是的,這是可能的。您有兩種選擇:
首先,您可以將所有來自外部庫的軟件包包含到軟件包的專用軟件包部分中。它將所有這些包與您的應用程序一起放入jar中。 第二個選擇是從外部庫製作一個有效的osgi包。
是的,您可以將外部庫嵌入到您的軟件包中,也可以將該庫作爲OSGi包裝(「OSGIfy」)。對於這兩個選項,Pax Construct(http://www.ops4j.org/projects/pax/construct)是一個很好的工具。
如果您的外部庫本身具有依賴關係,請將所有這些內容嵌入到一個包中,或者使用Pax Construct將它們包裝爲可傳遞的。
如果必須在包裝或嵌入之間進行選擇,請考慮依賴關係管理和捆綁版本。如果您需要升級外部庫並將其嵌入您自己的應用程序包中,則始終會同時釋放庫和您自己的代碼。例如,如果沒有激活應用程序包的2個版本,也可能無法激活2個庫的版本。 還......如果你不在OSGi環境中工作,你想在應用程序罐中添加第三方類嗎?那麼爲什麼在OSGi環境中呢?
我個人更喜歡在這種情況下將外部庫視爲黑盒,並將庫和它的依賴包裝在一個包中。