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

时间:2012-06-27 21:13:15

标签: java jar osgi

我是OSGi的新手,正在使用Equinox。我做了几次搜索,却找不到答案。 OSGI - handling 3rd party JARs required by a bundle的讨论有所帮助,但没有完全回答我的问题。

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

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

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

  1. 来自公共罐子的包已经包含在Equinox全局类路径中,rabbitmq-client.jar将从那里自动获取它们。
  2. 我必须使用两个公共罐子制作另一个包,导出所需的包,然后在Equinox中安装该包。
  3. 当我启动Equinox时,我必须将这两个公共jar放在全局类路径中,然后从那里rabbitmq-client.jar可以使用它们。
  4. 我已经读过,通常不会在OSGi容器中使用全局类路径。在构建单个bundle类路径时,我不清楚全局类路径中的项是否可用。但是,我注意到rabbitmq-client.jar还导入了其他包,例如javax.net,我认为这些包来自全局类路径。或者是否有其他一些出口产品?

    感谢您的帮助!

2 个答案:

答案 0 :(得分:5)

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

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

javax.net之类的包确实来自JRE,但它们仍未处于“全局类路径”中。有一个名为System Bundle的特殊包,它代表OSGi中的OSGi Framework本身。该捆绑包导出了一堆来自JRE的包,例如javax.netjavax.swingorg.w3c.dom等。

答案 1 :(得分:3)

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