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

时间:2011-02-08 09:18:12

标签: java jar osgi integration osgi-bundle

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

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

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

4 个答案:

答案 0 :(得分:22)

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

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

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

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

答案 1 :(得分:5)

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

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

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

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

答案 2 :(得分:3)

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

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

答案 3 :(得分:0)

对于Eclipse IDE;

  1. 在捆绑包下创建libs文件夹。
  2. 将不是OSGi捆绑软件的jar文件添加到libs文件夹中。
  3. 右键单击jar文件->单击“构建路径”->单击“添加到构建路径”