是否可以在 OSGi 应用程序中使用非 osgi 库?
例如,我正在开发一个基于语义的搜索引擎,并且我正在使用第三方自然语言处理库(http://wiki.opencog.org/w/RelEx_Dependency_Relationship_Extractor)。
是否可以将这样一个不支持 OSGi 的库作为几个 jar 文件与我的 OSGi 应用程序接口?
是否可以在 OSGi 应用程序中使用非 osgi 库?
例如,我正在开发一个基于语义的搜索引擎,并且我正在使用第三方自然语言处理库(http://wiki.opencog.org/w/RelEx_Dependency_Relationship_Extractor)。
是否可以将这样一个不支持 OSGi 的库作为几个 jar 文件与我的 OSGi 应用程序接口?
正如之前的答案中所写,如果您想在捆绑包中使用其他库,您有两个选择:
第一种方法更简单,因为您只需将库 jars(及其所有依赖项)复制到捆绑包(例如,复制到根目录),然后将它们添加到Bundle-Classpath
元素中MANIFEST.MF
(参见此处)。但是,在执行此操作时,您必须记住,此添加的库仅在嵌入它的包中可见(因此库重用受到限制)。您总是可以将此库中的包添加到Export-package
元素中,MANIFEST.MF
以使其对其他捆绑包可见,但这远非优雅的解决方案(但它会起作用)。
为了使它对其他包可见,您应该使用第二种方法,即从库中创建一个 OSGi 包(有一些工具可以帮助您做到这一点,在 Eclipse 中也是如此)。然而,对于更复杂的库,这种方法可能更难(因为 OSGi 中的依赖关系和特定的类加载方法)。
因此,如果您只想在一个包中使用该库,我建议使用第一种方法(它更容易实现)。如果你想在你的应用程序的许多包中使用这个库,你应该考虑第二种方法。
是的,您可以将外部库嵌入到包中,也可以将库包装(“OSGFy”)作为 OSGi 包。对于这两种选择,Pax Construct ( http://www.ops4j.org/projects/pax/construct ) 都是一个很好的工具。
如果您的外部库本身具有依赖项,请将所有这些嵌入到一个包中,或者使用 Pax Construct 将它们包装成可传递的。
如果必须在包装或嵌入之间进行选择,请考虑依赖管理和捆绑的版本控制。如果您需要升级外部库并且它嵌入在您自己的应用程序包中,您总是发布库和您自己的代码。例如,如果没有 2 个版本的应用程序包处于活动状态,也不能有 2 个版本的库处于活动状态。而且...如果您不在 OSGi 环境中工作,您想在应用程序 jar 中添加第三方类吗?那么为什么要在 OSGi 环境中进行呢?
在这种情况下,我个人更喜欢将外部库视为黑盒,并将库及其依赖项包装在一个包中。
是的,有可能。你有两个选择:
首先,您可以将外部库中的所有包包含到包的私有包部分。它会将所有这些包与您的应用程序一起包含到 jar 中。第二个选项是从外部库制作一个有效的 osgi 包。
对于 Eclipse IDE;