2012-06-27 109 views
4

我是OSGi的新手,并且正在使用Equinox。我已经做了几次搜索,并且无法找到答案。在OSGI - handling 3rd party JARs required by a bundle的讨论有所帮助,但并没有完全回答我的问题。OSGi bundle从非捆绑包jar包导入包:为它们创建捆绑包?

我已经获得了一个jar文件rabbitmq-client.jar,它已经打包为一个OSGi包(Bundle-Name和其他MANIFEST.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作为捆绑安装,访问需要从commons jar中导入的包的正确方法是什么?我能想到的只有三种选择,无需重建rabbitmq-client.jar

  1. 来自commons jars的软件包已包含在Equinox全局类路径中,并且rabbitmq-client.jar将从那里自动获取它们。
  2. 我必须用两个commons jar创建另一个bundle,导出所需的软件包,并在Equinox中安装该软件包。
  3. 当我启动Equinox时,必须将这两个commons jar放在全局类路径中,并且从那里可以使用rabbitmq-client.jar

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

感谢您的帮助!

回答

5

解决方案(2)是正确的方法。 (1)和(3)不起作用,因为如你已经理解的那样,在OSGi中不存在全局类路径。

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

包如javax.net确实来自JRE的,但他们仍然不一个“全局类路径”。有一个叫做System Bundle的特殊bundle,它代表OSGi中的OSGi框架本身。这束出口一堆包是来自JRE如javax.netjavax.swingorg.w3c.dom

+0

谢谢,@neil,这有帮助。我已经阅读了一些OSGi教程,但没有完全回答这些问题。我想我会在OSGi新手​​上徘徊一段时间,直到我弄明白为止。 –

2

我也想补充一下尼尔说,流行包,喜欢的commons-io的,通常有没有必要对于选项(2),因为其他人已经完成了它。有一个包含许多转换包的SpringSource存储库。对于commons-io,你可以做得更好,因为maven central的'官方'jar版本1.4已经是一个捆绑包了。

+0

+1谢谢我应该提到那 –

+0

谢谢,@holly,这有帮助。我确实看过SpringSource,看到了commons-io的一个包,但不是用于commons-cli。我必须再看一遍。 –

+0

只是一个评论:'rabbitmq-client.jar'实际上不再需要'commons-cli'或'commons-io'(自2.8.0版本以来)。这些罐子在'rabbitmq'库中提供,用于运行一些测试。 –

相关问题