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

Izz*_*zza 13 java integration osgi jar osgi-bundle

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

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

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

Pio*_*otr 22

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

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

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

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

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


小智 5

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

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

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

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