是否可以将非osgi库与OSGi应用程序一起使用?
举个例子,我正在开发一个基于语义的搜索引擎,我正在使用第三方自然语言处理库(http://wiki.opencog.org/w/RelEx_Dependency_Relationship_Extractor)。
是否可以将这样一个不支持OSGi的库作为几个jar文件与我的OSGi应用程序接口?
答案 0 :(得分:22)
如前所述,如果您想在捆绑包中使用其他库,则有两个选项:
第一种方法更简单,因为您只需要将库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;