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

Joh*_*ons 4 java osgi jar

我是OSGi的新手,我正在使用Equinox.我做了几次搜索,却找不到答案.OSGI的讨论- 处理捆绑所需的第三方JAR有所帮助,但并未完全回答我的问题.

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

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

我的具体问题是:如果我rabbitmq-client.jar作为一个bundle 安装,那么从commons jar导入需要访问它的软件包的正确方法是什么?我可以想到的只有三种选择,没有重建rabbitmq-client.jar.

  1. 来自commons jar的包已经包含在Equinox全局类路径中,并将rabbitmq-client.jar从那里自动获取它们.
  2. 我必须用两个公共罐子制作另一个包,导出所需的包,然后在Equinox中安装该包.
  3. 当我启动Equinox时,我必须将这两个公共罐放在全局类路径中,并且它们rabbitmq-client.jar将从那里开始.

我已经读过,通常不会在OSGi容器中使用全局类路径.在构建单个bundle类路径时,我不清楚全局类路径中的项是否可用.但是,我注意到rabbitmq-client.jar还会导入其他包,例如javax.net我认为来自全局类路径的包.或者是否有其他一些出口产品?

谢谢你的帮助!

Nei*_*ett 5

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

每个bundle都会导入它需要的所有包,并且这些包必须由另一个包导出.有一个例外,这是在所有类java.*的命名空间......也就是说,没有必要进口java.lang,java.util等等.

诸如此类的软件包javax.net来自JRE,但它们仍未处于"全局类路径"中.有一个名为System Bundle的特殊包,它代表OSGi中的OSGi Framework本身.这束出口一堆包是来自JRE如javax.net,javax.swing,org.w3c.dom,等.