OSGI应用程序中非OSGI库的用法

问题描述 投票:13回答:4

是否可以在OSGi应用程序中使用非osgi库?

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

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

java jar osgi integration osgi-bundle
4个回答
23
投票

如先前答案中所写,如果要在捆绑软件中使用其他库,则有两个选择:

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

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

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

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


5
投票

是,您可以将外部库嵌入到您的捆绑软件中,也可以将该库包装为OSGi捆绑软件(“ OSGIfy”)。对于这两个选项,Pax Construct(http://www.ops4j.org/projects/pax/construct)都是不错的工具。

如果您的外部库本身具有依赖项,则将所有这些都嵌入单个捆绑包中,或使用Pax构造将它们包装为可传递的。

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

我个人更喜欢在这种情况下将外部库视为黑盒,然后将库及其依赖项包装在一个单独的包中。


3
投票

是的,有可能。您有两个选择:

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


0
投票

对于Eclipse IDE;

  1. 在捆绑包下创建libs文件夹。
  2. 将不是OSGi捆绑软件的jar文件添加到libs文件夹。
  3. 右键单击到jar文件->单击“构建路径”->单击“添加到构建路径”
© www.soinside.com 2019 - 2024. All rights reserved.