Java OSGi bundle从非bundle jar导入包:为它们创建bundle吗?
我是OSGi新手,正在使用Equinox。我做了几次搜索,都找不到答案。会议上的讨论有些帮助,但没有完全回答我的问题 我已经获得了一个jar文件,Java OSGi bundle从非bundle jar导入包:为它们创建bundle吗?,java,jar,osgi,Java,Jar,Osgi,我是OSGi新手,正在使用Equinox。我做了几次搜索,都找不到答案。会议上的讨论有些帮助,但没有完全回答我的问题 我已经获得了一个jar文件,rabbitmq client.jar,它已经打包为一个OSGi捆绑包(MANIFEST.MF中有捆绑包名称和其他类似属性),我想作为捆绑包安装。这个jar从commons-io-1.2.jar导入包org.apache.commons.io和org.apache.commons.io.input。RabbitMQ client 2.7.1发行版还包括
rabbitmq client.jar
,它已经打包为一个OSGi捆绑包(MANIFEST.MF中有捆绑包名称和其他类似属性),我想作为捆绑包安装。这个jar从commons-io-1.2.jar
导入包org.apache.commons.io
和org.apache.commons.io.input
。RabbitMQ client 2.7.1发行版还包括commons-cli-1.1.jar
,因此我认为它也是必需的
我检查了这些commons JAR的清单,发现它们似乎没有打包成包。也就是说,它们的清单没有任何标准的bundle属性
我的具体问题是:如果我将rabbitmq client.jar
作为一个捆绑包安装,那么访问它需要从commons jar导入的包的正确方法是什么?在不重建rabbitmq client.jar
的情况下,我只能想到三种选择
rabbitmq client.jar
将从那里自动获取它们rabbitmq client.jar使用
rabbitmq client.jar
还导入了其他包,如javax.net
,我认为这些包来自全局类路径。或者是否有其他捆绑产品可以出口
谢谢你的帮助 解决方案(2)是正确的方法。(1) (3)将不起作用,因为正如您似乎已经理解的那样,OSGi中没有全局类路径
每个包导入它需要的所有包,这些包必须由另一个包导出。这有一个例外,即java.*
命名空间下的所有类。。。i、 e.无需导入java.lang
,java.util
等
诸如
javax.net
之类的包确实来自JRE,但它们仍然不在“全局类路径”上。有一个称为系统包的特殊包,它表示OSGi中的OSGi框架本身。该捆绑包导出了一组来自JRE的包,如javax.net
,javax.swing
,org.w3c.dom
,等等。我还想补充尼尔所说的,对于流行的捆绑包,如commons io,通常不需要选项(2),因为其他人已经做过了。有一个SpringSource存储库,其中包含许多已转换的bundle。对于commons io,您可以做得更好,因为maven central上的“官方”jar版本1.4已经是一个捆绑包 谢谢,尼尔,这很有帮助。我读过一些OSGi教程,但没有一本能准确回答这些问题。我想我会作为OSGi新手蹒跚一段时间,直到我明白过来。谢谢,@holly,这很有帮助。我确实看过SpringSource,看到了commons io的捆绑包,但没有commons cli的捆绑包。我必须再看一遍。只是一个注释:rabbitmq client.jar
实际上不再需要commons cli
或commons io
(从2.8.0版开始)。这些JAR在rabbitmq
存储库中提供,用于运行一些测试。