如何根据其符号名称检索Bundle?

Ale*_*nov 9 java osgi

文档BundleContext说它可以让你

  • 获取Framework中安装的bundle列表.
  • 获取Bundle的Bundle对象.

但是,没有getBundle(String symbolicName)方法,只有getBundle(long id)(并且不合适getBundle(String location).当然,可以调用getBundles()并迭代返回的数组,但是有更好的方法吗?

pal*_*int 7

我认为迭代数组getBundles()很好.也许它根本不存在,因为符号名称不能唯一地标识一个包.也许getBundles(String symbolicName)......

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

3.6.2 Bundle-SymbolicName

Bundle-SymbolicName清单头是一个强制性的报头.捆绑包符号名称和捆绑包版本标识唯一捆绑包.这并不总是暗示这对在框架中是唯一的,在某些情况下,同一个bundle可以在同一个框架中多次安装,请参阅第89页的Bundle Identifiers.

推荐的第89页(实际上是第95页):

4.4.1捆绑标识符

[...]

虽然该对是唯一的,但如果org.osgi.framework.bsnversion框架启动属性设置为多个,则可以多次安装相同的包.

  • 为了澄清......在OSGi R4.3之前,一对"Bundle-SymbolicName"(BSN)和Bundle-Version**始终是唯一的.在4.3中添加了`ResolverHook` API,它允许我们自定义和过滤分解包的方式,例如用子系统构建复合应用程序.在这种情况下,可能可以安装具有相同BSN和版本的两个捆绑,例如在两个不同的"区域"中.但这是一个高级用例. (3认同)