Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java OSGi bundle从非bundle jar导入包:为它们创建bundle吗?_Java_Jar_Osgi - Fatal编程技术网

Java OSGi bundle从非bundle jar导入包:为它们创建bundle吗?

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发行版还包括

我是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发行版还包括
commons-cli-1.1.jar
,因此我认为它也是必需的

我检查了这些commons JAR的清单,发现它们似乎没有打包成包。也就是说,它们的清单没有任何标准的bundle属性

我的具体问题是:如果我将
rabbitmq client.jar
作为一个捆绑包安装,那么访问它需要从commons jar导入的包的正确方法是什么?在不重建
rabbitmq client.jar
的情况下,我只能想到三种选择

  • 来自commons jar的包已经包含在Equinox全局类路径中,
    rabbitmq client.jar
    将从那里自动获取它们
  • 我必须用两个commons JAR制作另一个包,导出所需的包,并在Equinox中安装该包
  • 当我启动Equinox时,我必须将这两个commons jar放在全局类路径中,从那里它们将可供
    rabbitmq client.jar使用
  • 我已经读到,在OSGi容器中通常不使用全局类路径。我不清楚全局类路径中的项在构建单个包类路径时是否可用。但是,我注意到,
    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
    存储库中提供,用于运行一些测试。