OSGi 捆绑包从非捆绑包 jar 导入包:为它们创建捆绑包?

Posted

技术标签:

【中文标题】OSGi 捆绑包从非捆绑包 jar 导入包:为它们创建捆绑包?【英文标题】:OSGi bundle imports packages from non-bundle jars: create bundles for them? 【发布时间】:2012-06-29 09:31:56 【问题描述】:

我是 OSGi 的新手,并且正在使用 Equinox。我已经进行了几次搜索,但找不到任何答案。 OSGI - handling 3rd party JARs required by a bundle 的讨论有所帮助,但并未完全回答我的问题。

我已经获得了一个 jar 文件 rabbitmq-client.jar,它已经被打包为一个 OSGi 包(在它的 MANIFEST.MF 中带有 Bundle-Name 和其他此类属性),我想将它安装为一个包。这个 jar 从 commons-io-1.2.jar 导入包 org.apache.commons.ioorg.apache.commons.io.input。 RabbitMQ 客户端 2.7.1 发行版还包含commons-cli-1.1.jar,所以我认为它也是必需的。

我检查了这些公共 jar 的清单,发现它们似乎没有被打包为捆绑包。也就是说,它们的清单没有任何标准的捆绑属性。

我的具体问题是:如果我将rabbitmq-client.jar 安装为一个包,那么访问需要从公共 jar 导入的包的正确方法是什么?在不重建rabbitmq-client.jar的情况下,我只能想到三个替代方案。

    commons jar 中的包已经包含在 Equinox 全局类路径中,rabbitmq-client.jar 将从那里自动获取它们。 我必须使用两个公共 jar 制作另一个包,导出所需的包,然后在 Equinox 中安装该包。 当我启动 Equinox 时,我必须将这两个公共 jar 放在全局类路径中,它们将从那里提供给 rabbitmq-client.jar

我读到过通常不会在 OSGi 容器中使用全局类路径。我不清楚全局类路径中的项目在构建单个捆绑类路径时是否可用。但是,我注意到rabbitmq-client.jar 还导入了其他包,例如javax.net,我认为它们来自全局类路径。还是有其他一些捆绑包可以导出它们?

感谢您的帮助!

【问题讨论】:

【参考方案1】:

一种可能性是将非 OSGI jar 添加到 Bundle-classpath 中的 MANIFEST.MF

在以下示例中,通用引用包括文件夹“libs”(位于包的根文件夹中)内的所有 jar,并将它们添加到包类路径中。

虽然通常认为这不是一个好的做法(相对于显式导入所需的包),但要自动添加所有包,可以使用DynamicImport-Package。当罐子被放入一个单独的“包装”包中时,正如 Neil Bartlett 所提议的那样,这应该不会造成太大的伤害:

Bundle-ClassPath: libs/*.jar
DynamicImport-Package: *

在这种情况下,对于其他非 jar 依赖项,例如。 G。 dll 文件,将以下内容添加到build.properties 将包含文件夹“libs”及其子文件夹中的所有内容,并具有相同的文件夹结构:

bin.includes = META-INF/,\
           .,\
           libs/**

【讨论】:

【参考方案2】:

我还要补充一下 Neil 所说的,对于流行的捆绑包,比如 commons-io,通常不需要选项 (2),因为其他人已经这样做了。有一个 SpringSource 存储库,其中包含许多转换后的捆绑包。对于 commons-io,您可以做得更好,因为 maven Central 上的“官方”jar 版本 1.4 已经是一个捆绑包。

【讨论】:

谢谢,@holly,这很有帮助。我确实查看了 SpringSource 并看到了 commons-io 的捆绑包,但没有看到 commons-cli 的捆绑包。我得再看一遍。 只是一条评论:rabbitmq-client.jar 实际上不应该再需要commons-clicommons-io(自2.8.0 版起)。这些 jars 在 rabbitmq 存储库中提供,用于运行一些测试。【参考方案3】:

解决方案(2)是正确的方法。 (1) 和 (3) 不起作用,因为您似乎已经理解,OSGi 中没有全局类路径之类的东西。

每个包都会导入它需要的所有包,而这些包必须由另一个包导出。有一个例外,就是java.*命名空间下的所有类...即不需要导入java.langjava.util等。

javax.net 等包确实来自 JRE,但它们仍然不在“全局类路径”上。有一个称为 System Bundle 的特殊包,它代表 OSGi 中的 OSGi 框架本身。该捆绑包导出一堆来自 JRE 的包,例如 javax.netjavax.swingorg.w3c.dom 等。

【讨论】:

谢谢,@neil,这很有帮助。我已经阅读了一些 OSGi 教程,但没有一个能准确回答这些问题。我想我作为一个 OSGi 新手在搞清楚之前会磕磕绊绊一段时间。

以上是关于OSGi 捆绑包从非捆绑包 jar 导入包:为它们创建捆绑包?的主要内容,如果未能解决你的问题,请参考以下文章

OSGI - 处理 3rd 方 JAR 及其依赖项

Liferay 模块(OSGi 捆绑包)停留在“Stopping”

对 OSGi 捆绑包的完整 Android 支持 [关闭]

YouTube API - Oauth2 流程(OSGI 捆绑包)

OSGi - 相互依赖的捆绑包

Apache Karaf 和 OSGI 捆绑包