捆绑罐:为他们创建捆绑?

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

我已经获得了一个jar文件rabbitmq-client.jar ,该文件已经打包为一个OSGi包(Bundle-Name和其他MANIFEST.MF中的这些属性),我想将其作为一个包进行安装。 该jar从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

  • Commons rabbitmq-client.jar的软件包已经包含在Equinox全局类路径中, rabbitmq-client.jar将从那里自动获取它们。
  • 我必须用两个普通罐子制作另一个捆绑包,导出所需的软件包,并在Equinox中安装该软件包。
  • 当我启动Equinox时,我必须将这两个commons jar放入全局类路径中,并从那里将它们提供给rabbitmq-client.jar
  • 我读过一个通常不使用OSGi容器中的全局类路径。 我不清楚全局类路径中的项是否在构建单独的束类路径时可用。 但是,我注意到rabbitmq-client.jar也导入了其他包,例如javax.net ,我猜想它来自全局类路径。 还是有一些其他的捆绑出口呢?

    感谢您的帮助!


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

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

    javax.net这样的包来自JRE,但它们仍然不在“全局类路径”上。 有一个叫做System Bundle的特殊bundle,它代表OSGi中的OSGi框架本身。 该bundle会导出一堆来自JRE的软件包,如javax.netjavax.swingorg.w3c.dom等。


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

    链接地址: http://www.djcxy.com/p/74717.html

    上一篇: bundle jars: create bundles for them?

    下一篇: Query Returns No Results Only When ORDER BY Added