Java 如何检索具有符号名称的捆绑包?

Java 如何检索具有符号名称的捆绑包?,java,osgi,Java,Osgi,BundleContext的文档说明它可以 获取框架中安装的捆绑包列表 获取Bundle的Bundle对象 但是,没有getBundle(String symbolicName)方法,只有getBundle(long id)(以及不合适的getBundle(字符串位置)。当然,可以调用getBundles()并迭代返回的数组,但是有更好的方法吗?我从来没有见过这样做的例子。但是有PackageAdmin服务,也许你想看看这个,但它似乎不太受欢迎。替换包org.osgi.framework.w

BundleContext
的文档说明它可以

  • 获取框架中安装的捆绑包列表
  • 获取Bundle的Bundle对象

但是,没有
getBundle(String symbolicName)
方法,只有
getBundle(long id)
(以及不合适的
getBundle(字符串位置)
。当然,可以调用
getBundles()
并迭代返回的数组,但是有更好的方法吗?

我从来没有见过这样做的例子。但是有
PackageAdmin
服务,也许你想看看这个,但它似乎不太受欢迎。替换包
org.osgi.framework.wiring
似乎没有提供这样的方法


澄清一下:拥有一个Bundle实例的目的是什么?

我认为遍历
getBundles()
数组是可以的。可能它根本不应该存在,因为符号名不能唯一标识Bundle。可能
getBundles(String symbolicName)

OSGi服务平台核心规范第4版第4.3版:

3.6.2束符号名称

Bundle SymbolicName
manifest头是必需的头 bundle符号名称和bundle版本标识唯一的bundle 这并不总是意味着这一对在框架中是唯一的 在某些情况下,同一捆绑包可以在中多次安装 相同的框架,请参见第89页的捆绑标识

参考第89页(实际上是第95页):

4.4.1包标识符

[……]

虽然这对是唯一的,但也可以安装相同的捆绑包 如果
org.osgi.framework.bsonversion
framework 启动属性设置为多个


“在某些情况下,同一个捆绑包可以在同一个框架中多次安装”很好,我没有想到这一点。在这句话中,我认为规范提到了多次安装具有相同符号名称和相同版本号的jar。(不安装具有相同符号名称但版本号不同的捆绑包。)值得检查参考的第4.4.1章。为了澄清……在OSGi R4.3之前,
束符号name
(BSN)对捆绑包版本始终是唯一的。在4.3中添加了
ResolverHook
API,它允许我们自定义和过滤捆绑包解析的方式,例如构建具有子系统的复合应用程序。在这种情况下,可能会安装具有相同BSN和版本的两个捆绑包,例如在两个不同的“区域”。但这是一个高级用例。