我是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.input
和commons-io-1.2.jar
。 RabbitMQ客户端2.7.1发行版还包含commons-cli-1.1.jar
,因此我认为它也是必需的。
我检查了这些公共罐子的清单,发现它们似乎没有打包成捆。也就是说,它们的清单没有标准的束属性。
我的具体问题是:如果我将rabbitmq-client.jar
作为捆绑包安装,那么从commons jar导入需要访问的软件包的正确方法是什么?在没有重建rabbitmq-client.jar
的情况下,我只能想到三种选择。
rabbitmq-client.jar
将从那里自动获取它们。rabbitmq-client.jar
可以使用它们。我已经读过,通常不会在OSGi容器中使用全局类路径。在构建单个bundle类路径时,我不清楚全局类路径中的项是否可用。但是,我注意到rabbitmq-client.jar
还导入了其他包,例如javax.net
,我认为这些包来自全局类路径。或者是否有其他一些出口产品?
感谢您的帮助!
答案 0 :(得分: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
等。
答案 1 :(得分:3)
我还要补充说Neil已经说过,对于流行的捆绑包,比如commons-io,通常不需要选项(2),因为其他人已经做过了。有一个包含许多转换包的SpringSource存储库。对于commons-io你可以做得更好,因为maven central上的'官方'jar的1.4版本已经是一个捆绑。