OSGi bundle 从非 bundle jar 导入软件包:为它们创建软件包



我是OSGi的新手,正在使用Equinox。 我已经进行了几次搜索,但找不到答案。 OSGI 上的讨论 - 处理捆绑包所需的第三方 JAR 有所帮助,但不能完全回答我的问题。

我得到了一个jar文件,rabbitmq-client.jar,它已经打包为OSGi捆绑包(在其清单中带有捆绑包名称和其他此类属性。MF),我想将其作为捆绑包安装。 这个罐子从commons-io-1.2.jar org.apache.commons.ioorg.apache.commons.io.input导入包裹。 RabbitMQ 客户端 2.7.1 发行版也包括 commons-cli-1.1.jar ,所以我认为这也是必需的。

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

我的具体问题是:如果我将rabbitmq-client.jar作为捆绑包安装,那么访问需要从公共jar导入的软件包的正确方法是什么? 我能想到的只有三种选择,无需重建rabbitmq-client.jar.

  1. 来自 commons jar 的软件包已经包含在 Equinox 全局类路径中,rabbitmq-client.jar会自动从那里获取它们。
  2. 我必须用两个公共罐子制作另一个捆绑包,导出所需的包,并在春分中安装该捆绑包。
  3. 当我启动 Equinox 时,我必须将这两个公共罐子放在全局类路径中,它们将从那里可供rabbitmq-client.jar使用。

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

感谢您的任何帮助!

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

每个捆绑包

导入它需要的所有包,并且这些包必须由另一个捆绑包导出。有一个例外,那就是 java.* 命名空间下的所有类......即无需导入java.langjava.util等。

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

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

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

在下面的示例中,泛型引用包含文件夹 "libs"(位于捆绑包的根文件夹中)中的所有 jar,并将它们添加到捆绑包类路径中。

尽管通常认为这不是一个好的做法(与显式导入所需的包相比),但自动添加所有包,可以使用DynamicImport-Package。当罐子被放在一个单独的"包装"捆绑包中时,正如bei Neil Bartlett所建议的那样,这应该不会造成太大伤害:

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

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

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

最新更新