osgi应用程序中的非osgi库使用

是否可以将非osgi库与OSGi应用程序一起使用?

举个例子,我正在开发一个基于语义的搜索引擎,我正在使用第三方自然语言处理库( http://wiki.opencog.org/w/RelEx_Dependency_Relationship_Extractor )。

是否有可能将这样一个不支持OSGi的库作为几个jar文件与我的OSGi应用程序接口?

如前所述,如果要在捆绑包中使用其他库,则有两个选项:

  1. 将库jar嵌入到将要使用的包中,
  2. 从库中创建有效的OSGi包。

一种方法更简单,因为您只需要将库jar(及其所有依赖项)复制到一个包(例如,复制到根目录),然后将它们添加到MANIFEST.MF Bundle-Classpath元素(参见此处 )。 但是,在执行此操作时,您必须记住,此添加的库仅在嵌入它的包中可见(因此库重用受限)。 您总是可以将此库中Export-package添加到MANIFEST.MF Export-package元素,以使其对其他包可见,但这远非优雅的解决方案(但它可以工作)。

为了使其对其他bundle可见,你应该使用第二种方法 ,即从库中创建一个OSGi包(有些工具可以帮助你做到这一点,也在Eclipse中)。 但是,对于更复杂的库,这种方法可能更难(因为OSGi中的依赖性和特定的类加载方法)。

因此,如果您只想在一个包中使用该库,我建议使用第一种方法(它更容易实现)。 如果要在应用程序的许多软件包中使用此库,则应考虑第二种方法。

是的,您可以将外部库嵌入到包中,也可以将库包装(“OSGIfy”)作为OSGi包。 对于这两个选项,Pax Construct( http://www.ops4j.org/projects/pax/construct )是一个很好的工具。

如果外部库本身具有依赖关系,则将所有这些嵌入到单个包中或使用Pax Construct将它们包含在传递中。

如果必须在包装或嵌入之间进行选择,请考虑捆绑包的依赖关系管理和版本控制。 如果您需要升级外部库并将其嵌入到您自己的应用程序包中,则始终同时发布库和您自己的代码。 例如,如果没有2个版本的应用程序包处于活动状态,也不可能使2个版本的库处于活动状态。 而且……如果你不在OSGi环境中工作,你想在你的应用程序jar中添加第三方类吗? 那么为什么要在OSGi环境中呢?

我个人更喜欢在这种情况下将外部lib看作黑盒子,并将库和它的依赖包装在一个包中。

对的,这是可能的。 你有两个选择:

首先,您可以将外部库中的所有包包含到捆绑包的私有包部分中。 它会将所有这些包包含在您的应用程序的jar中。 第二个选项是从外部库生成有效的osgi包。