4

我是 OSGi 的新手,并且正在使用 Equinox。我已经进行了几次搜索,但找不到任何答案。OSGI上的讨论- 处理捆绑包所需的 3rd 方 JAR 在一定程度上有所帮助,但并没有完全回答我的问题。

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

我检查了这些公用 jar 的清单,发现它们似乎没有打包为捆绑包。也就是说,它们的清单没有任何标准捆绑属性。

我的具体问题是:如果我rabbitmq-client.jar作为一个包安装,那么访问需要从公共 jar 导入的包的正确方法是什么?我只能想到三个替代方案,而无需重新构建rabbitmq-client.jar.

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

我读过一个通常不使用 OSGi 容器中的全局类路径。我不清楚全局类路径中的项目在构建单个捆绑类路径时是否可用。但是,我注意到rabbitmq-client.jar它还导入了其他包,例如javax.net我认为来自全局类路径的包。还是有其他一些捆绑包可以导出它们?

感谢您的帮助!

4

3 回答 3

5

解决方案(2)是正确的方法。(1) 和 (3) 不起作用,因为正如您似乎已经理解的那样,OSGi 中没有全局类路径之类的东西。

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

诸如此类的包javax.net确实来自 JRE,但它们仍然不在“全局类路径”上。有一个称为 System Bundle 的特殊包,它代表 OSGi 中的 OSGi 框架本身。该捆绑包导出一堆来自 JRE 的包,例如javax.netjavax.swingorg.w3c.dom等。

于 2012-06-27T21:20:50.373 回答
3

我还要补充一下 Neil 所说的,对于流行的捆绑包,比如 commons-io,通常不需要选项 (2),因为其他人已经这样做了。有一个 SpringSource 存储库,其中包含许多转换后的捆绑包。对于 commons-io,您可以做得更好,因为 maven Central 上的“官方”jar 版本 1.4 已经是一个捆绑包。

于 2012-06-28T02:05:38.580 回答
0

一种可能是将非 OSGI jar 添加Bundle-classpathMANIFEST.MF.

在以下示例中,通用引用包括文件夹“libs”(位于包的根文件夹中)内的所有 jar,并将它们添加到包类路径中。

虽然通常认为这不是一个好的做法(与显式导入所需的包相比),但DynamicImport-Package可以使用自动添加所有包。当罐子被放入一个单独的“包装”包中时,正如 Neil Bartlett 所提议的那样,这不会造成太大的伤害:

Bundle-ClassPath: libs/*.jar
DynamicImport-Package: *

在这种情况下,对于其他非 jar 依赖项,例如 dll 文件,添加以下内容build.properties会将文件夹“libs”及其子文件夹中的所有内容包含到包中,并具有相同的文件夹结构:

bin.includes = META-INF/,\
           .,\
           libs/**
于 2021-12-06T18:33:41.157 回答