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

2022-09-03 18:05:00

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

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

有没有可能将这样一个库与我的OSGi应用程序连接起来,它不支持OSGi,作为几个jar文件?


答案 1

正如在前面的答案中所写的那样,如果要在捆绑包中使用其他库,您有两种选择:

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

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

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

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


答案 2

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

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

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

在这种情况下,我个人更喜欢将外部lib视为黑匣子,并将库及其依赖项包装在单个捆绑包中。


推荐